iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >老生常谈c++中的静态成员
  • 548
分享到

老生常谈c++中的静态成员

2024-04-02 19:04:59 548人浏览 泡泡鱼
摘要

引言 有时候需要类的一些成员与类本身相关联,而不是与类的每个对象相关联。比如类的所有对象都要共享的变量,这个时候我们就要用到类的静态成员。 声明类的静态成员 声明静态成员的方法是使用

引言

有时候需要类的一些成员与类本身相关联,而不是与类的每个对象相关联。比如类的所有对象都要共享的变量,这个时候我们就要用到类的静态成员。

声明类的静态成员

声明静态成员的方法是使用static关键字。

static成员可以是public也可以是private的。

例如,定义一个类表示银行的账户记录:


class Account{
public:
    //其他非静态函数及数据成员
    //静态函数
    static double get_rate(){ return interestRate; }
    static void set_rate(double r){ interestRate = r; }
private:
    static double interestRate;//该类的所有对象公用同一个利率
    //其他static private函数
    //其他非static 函数及数据成员
};

Note:

  • 类的静态成员存在于任何对象之外,对象中不包含任何与静态数据成员有关的数据。
  • 静态成员函数不与任何对象绑定到一起,不能在静态成员函数中使用this指针。静态成员函数不能被声明为const。

使用类的静态成员

使用作用域运算符::直接访问静态成员。


double r;
r = Account::get_rate();

虽然静态成员不属于类的任何对象,但仍然可以通过类的对象访问静态成员。


Account ac1;
Account *ac2 = &ac1;
double r = ac1.get_rate();
r = ac2->get_rate();

成员函数可以直接使用静态成员,不需要作用域运算符。

定义静态成员

定义静态成员函数

类的静态成员函数既可以定义在类的外部也可以定义在类的内部(注意定义和声明的区别)。

当在类的外部定义静态成员函数时,不能使用static关键字,static关键字只在类内部该静态成员函数的声明处使用。否则重复。

当在类的外部定义静态成员函数时,必须指明该函数所属的类,如:


class Account{
public:
    //其他非静态函数及数据成员
    //静态成员函数
    static double get_rate(){ return interestRate; }
    static void set_rate(double r){ interestRate = r; }
    static void print();//静态成员函数声明
private:
    static double interestRate;//该类的所有对象公用同一个利率
    //其他static private函数
    //其他非static 函数及数据成员
};
//定义静态函数时不需要使用static关键字,否则重复。另外指明该函数所属的类。
void Account::print(){
    //要完成的工作
}

定义静态数据成员

因为静态数据成员不属于类的任何一个对象,所以他们并不是在创建类的对象的时候被定义的。不能在类的内部初始化静态数据成员,必须在类的外部定义和初始化每个静态数据成员。


double Account::interestRate = initRate();//不用static关键字

静态数据成员的类内初始化

前面提到,类的静态数据成员不应该在类的内部被初始化。但若静态数据成员同时还是constexpr类型,则可以在类内初始化。

即使一个常量静态成员在类内被初始化了,通常也应该在类的外部定义一下该成员,但类外定义使不能再指定初始值,因为在类内已经提供了初始值。

静态数据成员的特殊应用场景

1.静态成员独立于任何对象,因此,静态数据成员的类型可以是他所属的类类型,非静态数据成员只能声明为他所属的类的指针或引用。
例如:


class Person{
public:
    //...
private:
    static Person p; //正确,静态数据成员可以是不完全类型
    Person *p1;     //正确:指针成员和引用可以是不完全类型
    Person &p2      //正确
    Person p3;      //错误:数据成员必须是完全类型。
};//在此之前,class Person之后,Person类都是不完全类型,因只声明完但还没有定义完

2.可以使用静态成员作为默认实参


class Screen{
public:
    Screen& clear(char = bkground);
private:
    static const char bkground;
}

非静态数据成员不能作为默认实参,因为非静态数据成员属于对象,对象的值是在运行时确定的,但默认参数却是在编译时确定的,也就是说,默认参数确定时还没有真正的对象被创建,因此不能用非静态数据成员作为默认参数,否则引发错误。

声明:
c++ Basic是对《C++ Primer 第五版》的个人总结与疑难解释。
如果想要深入了解更多,请支持正版。

到此这篇关于老生常谈c++中的静态成员的文章就介绍到这了,更多相关c++静态成员内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 老生常谈c++中的静态成员

本文链接: https://www.lsjlt.com/news/130849.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 老生常谈c++中的静态成员
    引言 有时候需要类的一些成员与类本身相关联,而不是与类的每个对象相关联。比如类的所有对象都要共享的变量,这个时候我们就要用到类的静态成员。 声明类的静态成员 声明静态成员的方法是使用...
    99+
    2024-04-02
  • 老生常谈C++ 中的继承
    目录继承1.1 继承的概念1.2 继承的定义1.2.1 定义格式2 基类(父类)对象和派生类(子类)对象之间的赋值转换 3 继承中的作用域4 派生类(子类)的默认成员函数5...
    99+
    2024-04-02
  • C++的静态成员变量和静态成员函数详解
    目录一.static修饰变量二.static修饰函数三.static在类中使用1.创建与初始化 2.使用问题 3.在public、private下static变量使用 四.class...
    99+
    2024-04-02
  • C++类的静态成员变量与静态成员函数详解
    目录1、类的静态成员变量2、静态成员函数总结1、类的静态成员变量 C++类的静态成员变量主要有以下特性: 1.静态成员变量需要类内定义,类外初始化 2.静态成员变量不依赖于类,静态成...
    99+
    2024-04-02
  • 老生常谈C++explicit关键字
    目录显式和隐式的区别总结explicit 关键字用于显式声明一个类构造函数是显式而非隐式的,从而禁用类构造函数的隐式自动类型转换。类构造函数默认情况下即声明为implici...
    99+
    2023-03-24
    C++ explicit关键字 C++ explicit
  • c++中的静态成员怎么声明
    本篇内容主要讲解“c++中的静态成员怎么声明”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“c++中的静态成员怎么声明”吧!引言有时候需要类的一些成员与类本身相关联,而不是与类的每个对象相关联。比...
    99+
    2023-06-19
  • 怎么理解C++的静态成员变量和静态成员函数
    怎么理解C++的静态成员变量和静态成员函数,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一.static修饰变量void text() {static&nb...
    99+
    2023-06-22
  • 老生常谈C语言中指针的使用
    目录前提一.指针基础1.1 变量指针1.2 数据指针1.3 指针的本质1.4 指针数组1.5 指针的移动1.5 Scanf函数的解释二.指针的进阶玩法2.1 二维指针2.2 结构体指...
    99+
    2024-04-02
  • 老生常谈Python中的Pickle库
    目录简介pickle与json比较函数dumpsloadsdumpload简介 Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任...
    99+
    2024-04-02
  • C++的静态成员变量和静态成员函数你了解多少
    目录静态成员变量静态变量在任何类对象创建前初始化定义静态成员变量使用静态成员变量类对象共享静态成员const constexpr静态成员函数总结静态成员变量 这里先引用Geeksfo...
    99+
    2024-04-02
  • 怎么理解C++类的静态成员变量与静态成员函数
    本篇内容介绍了“怎么理解C++类的静态成员变量与静态成员函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、类的静态成员变量C++类的静态...
    99+
    2023-06-25
  • C#中静态类和静态类成员的区别是什么
    C#中静态类和静态类成员的区别是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#静态类和静态类成员用于创建无需创建类的实例就能够访问的数据和函数。静态类成员可用于分离独立...
    99+
    2023-06-17
  • C++类的静态成员有哪些
    本篇内容介绍了“C++类的静态成员有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在静态成员函数的实现中不能直接引用类中说明的非静态成员...
    99+
    2023-06-17
  • C++的static静态成员是什么
    今天小编给大家分享一下C++的static静态成员是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、静态成员即在定义前...
    99+
    2023-06-29
  • 老生常谈.NET中的 COM 组件
    目录什么是COM组件?使用COM组件需要注意:一:背景1.讲故事二:COM 多语言互操作1. 背景2. C# 写一个 COM 组件3. 注册 COM 到注册表4. 使用 C++ 调用...
    99+
    2022-11-13
    .NET  COM 组件 .NET组件
  • 怎样使用C++静态成员
    怎样使用C++静态成员,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。在C++中,C++静态成员的提出是为了解决数据共享的问题。实现共享的作用,下面主要讲述的是如...
    99+
    2023-06-17
  • 老生常谈java中的Future模式
    jdk1.7.0_79 本文实际上是对上文《简单谈谈ThreadPoolExecutor线程池之submit方法》的一个延续或者一个补充。在上文中提到的submit方法里出现了FutureTask,这不得不停止脚步将方向转向Java的Fut...
    99+
    2023-05-31
    java future模式 ava
  • 老生常谈Java动态编译(必看篇)
    一、动态编译简介new创建对象是静态加载类,在编译时刻就需要加载所有可能使用到的类。一百个类,有一个类错了,都无法编译。通过动态加载类可以解决该问题二、代码实例2.1 OfficeBetter.javamain接口里面通过对Class类的动...
    99+
    2023-05-31
    java 动态编译 ava
  • C语言函数指针的老生常谈
    目录函数指针函数指针的应用函数指针作为参数实例(qsort函数)总结 函数指针 本质上是一个指针,只不过指向函数而已。 编译器在编译期间对函数开辟了一块空间,而这快空间的开始地址,就...
    99+
    2024-04-02
  • 老生常谈vue的生命周期
    目录一、什么是生命周期二、生命周期函数三、生命周期的流程四、简单的生命周期代码总结一、什么是生命周期 每一个组件都可能经历从创建,挂载,更新,卸载的过程。 在这个过程中的某一个阶段,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作