用关键字static声明的类成员。对于静态成员变量,无论创建了多少个类对象,程序都只创建一份静态成员变量,所有的对象共享类的静态成员变量。
静态数据成员是静态存储的,静态成员变量在使用前必须初始化! 不能在类声明种初始化静态成员变量,这是因为声明描述了如何分配内存,但并不分配内存。
需要在类声明之外,使用单独的语句来进行初始化。初始化语句需要指出类型,并使用域操作符,前面不加static。不管静态成员变量是public,private,还是protected都可以直接进行初始化: 类型 <类名>::<静态成员名> = xxx
初始化需在cpp文件中进行,这是因为 如果在头文件中进行初始化,该头文件可能被多个其他文件包含,导致重复初始化,导致错误!
静态成员变量的访问:
如果是public类型,则可以直接 className::变量名 , 如果是privaite或protected,则这种方法不能编译通过,需要单独定义个public类型函数来访问,如下面的例子中的getNum成员函数。
例子:
#include <iostream>
using namespace std;
class test
{
public:
test(int a=0);
~test();
void printNum(test obj);
int a;
int getNum()
{
return num; //通过公有成员函数来访问私有静态成员变量
}
private:
static int num;
};
int test::num = 9; //在类外进行初始化!!
int main()
{
test obj;
int c = obj.getNum();
getchar();
return 0;
}
其他:
静态成员函数中不能使用非静态成员。
类的非静态成员函数可以调用用静态成员函数,因为静态成员属于类本身,在类的对象产生之前就已经存在了,所以在非静态成员函数中是可以调用静态成员的。
类的对象可以直接使用public类型的静态成员函数,例如 objName.func();
Ref:
《c++ primer plus,第五版》-12.1.1
《程序员面试宝典》