这是因为类内的声明只是描述了类的成员变量和成员函数的类型,而不为它们分配内存空间,因此需要在类外声明一次静态成员变量以分配内存空间。
例如,假设有一个类定义如下:
class MyClass
{
public:static int myStaticVar;
};
则需要在类外定义静态成员变量myStaticVar:
int MyClass::myStaticVar;
这样,myStaticVar 就被分配了内存空间。注意,定义时不能使用static关键字,否则会导致编译错误。当然最好是在声明的时候直接赋予初值
int MyClass::myStaticVar = 0;
否则没有赋予初值的话,一般还要定义一个静态成员函数Init()来做初始化
例如,假设有一个类定义如下:
class MyClass {
public:static int myStaticVar;void init() {myStaticVar = 42;}
};
int MyClass::myStaticVar;
但是需要注意的是,静态成员变量只能被初始化一次,因此需要确保在整个程序中只有一次初始化。
正确做法如下
class MyClass {
public:MyClass(int value1, int& value2): myConstVar(value1), myRefVar(value2) {// myConstVar = value; // error: assignment of read-only member 'MyClass::myConstVar'}private:const int myConstVar;int& myRefVar;
};
如果尝试在构造函数内部进行初始化会报错