——什么时候使用静态数据成员
- 没必要让所有类对象都包含某个变量的副本(需要被类及派生类的所有对象共享);
- 或者这么做无法完成特定的任务
例如:一个类内部的计数器(每产生一个对象,自动加1),此时就没有必要使类的每个对象都包含这样的副本
——怎么定义静态数据成员
- C++11版本
- static int sCounter = 0; //直接在头文件中类的定义中声明和定义即可
- 以前的版本
- Step1:在类定义中声明:static int sCounter;
- Step2:在cpp中初始化:const className::sCounter = 0;
——怎么使用静态数据成员
- 在类的方法内访问:同普通数据成员
- 在类的方法外访问(假设静态数据成员是public)
- int c = className::sCounter; //使用作用域::
- 最好:不要使用public,而是提供公有get/set()方法
——静态数据成员的实质
- 静态数据成员实际上是类域中的全局变量;
-
不管类的对象有多少个,其静态数据成员只有一个,各对象共享;
- 在一个类的对象空间内,不包含静态成员的空间,所以静态成员所占空间不会随对象的产生而分配,也不会随对象的消失而收回;
- 静态数据成员的存储空间的分配在程序一开始运行时就被分配,并不是在程序运行过程中在某一函数内分配空间和初始化
——静态方法
- 与静态数据成员类似,静态方法也不属于某个对象,而是为类及其派生类的所有对象所共享;
- 因为不属于特定对象,故没有this指针; 实际上,静态方法就像一个普通函数(而不是类方法)
- 如果是私有或保护的静态方法:在类内可以像调用普通函数一样调用;
- 如果是公有的静态方法:在类外也可以调用,只是需要加上作用域:className::XXX