1、类的静态成员变量,必须在类外再声明一次
这是因为类内的声明只是描述了类的成员变量和成员函数的类型,而不为它们分配内存空间,因此需要在类外声明一次静态成员变量以分配内存空间。
例如,假设有一个类定义如下:
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;
但是需要注意的是,静态成员变量只能被初始化一次,因此需要确保在整个程序中只有一次初始化。
2、类的常量或引用成员变量只能在初始化列表中初始化
正确做法如下
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;
};
如果尝试在构造函数内部进行初始化会报错