2017-03-13 163 views
1

工作考虑的代码片段常变量初始化只与成员初始化列表

class Test{ 
    const int i; 
    public: 
// Test(int x):i(x){} This works 
    Test(int x){ 
     i=x; 
    } //this doesn't work 

为什么在联成员初始化列表的工作而正常初始化不起作用?

+0

你所说的“正常初始化”不是初始化。有很多关于初始化数据成员的文章。 – juanchopanza

+1

'i = x;'不是**初始化**。它是**作业**。你可以改变const变量的值。 – JustRufus

+0

[未初始化的常量成员在类中]的可能重复(http://stackoverflow.com/questions/4343934/uninitialized-constant-members-in-classes) – Jonas

回答

1

请注意,i=x;是一项任务。如果你没有通过成员初始化列表初始化它,i将被尝试默认初始化,然后在构造函数的主体中赋值。

但作为const变量,i不能被默认初始化(或分配)。所以必须在member intializer list中指定初始化。

成员初始化列表是可以指定这些对象的非默认初始化的地方。对于不能被默认初始化的成员,例如引用成员和常量限定类型,必须指定成员初始值设定项。