为什么在C ++ 11中允许第二次初始化

时间:2015-09-14 21:03:00

标签: c++ c++11 initialization

在C ++ 11下,可以在声明时直接初始化类成员。但是也可以在构造函数的初始化列表中再次初始化它们......为什么?

#include <iostream>



struct MyStr
{

    MyStr()
    :j(0)
    {
        std::cout << "j is " << j << std::endl; // prints "j is 0"
    }

    const int j = 1;

};

int main()
{
    const int i = 0;

    MyStr mstr; 
}

因为做这样的事情是一个错误,可以理解:

MyStr()
:j(0),
j(1)
{
}

第一个例子有什么不同,其中数据成员在声明时初始化,然后再在构造函数的初始化列表中初始化?

2 个答案:

答案 0 :(得分:10)

实际上只有一个初始化。只是你被允许写一个&#34;默认&#34;一个以 brace-or-equals初始值设定项的形式,但如果你的构造函数初始值设定项列表也指定了一个初始值设定项,那么它就是唯一一个使用过的。

作为旁注,从C ++ 14开始,可以为聚合的非静态数据成员(不能有构造函数)提供 brace-or-equals初始值设定项。 / p>

答案 1 :(得分:8)

这样单个构造函数可以覆盖它。

来自the original feature proposal

  

可能会发生数据成员通常具有特定值,但是一些专门的构造函数需要认识到该值。如果构造函数显式初始化特定成员,则构造函数初始化将覆盖成员初始化,如下所示: [..]

请记住,您可以拥有多个构造函数。