我总是读取初始化列表比构造函数体更适合初始化.我也知道静态变量可以在类外部进行初始化.
但我的问题是为什么我们不能在构造函数初始化列表中初始化静态变量,但我们可以在构造函数体中
class sample
{
static int i;
public:
sample (int ii=20) { i=ii;}
void show()
{
cout << i << endl;
}
};
int sample::i=12;
int main()
{
sample s;
s.show();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
工作正常并打印20.但我替换构造函数
sample (int ii=20): i(ii){}
Run Code Online (Sandbox Code Playgroud)
它给出了错误.为什么?
成员初始化列表表示初始化。static在您的程序开始时(之前main)已经初始化了一个成员。如果您可以按照您的建议进行操作,您将使用sample您创建的每个对象“重新初始化”静态成员,但对象仅初始化一次。
相反,如果您想在初始化后更改对象的值,则必须为其赋值。这正是您的第一个代码使用i = ii;.
在构造函数的主体中,您指定.初始化可以只在intializion列表来完成.
你认为初始化静态成员只是一个赋值.您可以自己测试:创建静态成员const,您的构造函数将不再有效.
然后,构造函数初始化列表仅适用于实例成员.但是,静态成员不是类的实例的成员,而是与其他类成员具有相同可见性的全局变量; 因此,在类初始化列表中"初始化"它们的任何尝试实际上都是静态成员的"重新初始化",这在C++中是被禁止的.