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

5

在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)
{
}

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

1
只有一个初始化。 - juanchopanza
2个回答

10

只有一个初始化实际发生。只是你可以用 花括号或等于符号初始化器 的形式编写一个“默认”的初始化器,但如果你的构造函数初始化列表也指定了一个初始化器,那么它就是唯一使用的。

另外值得一提的是,在C++14中,聚合体的非静态数据成员(不能有构造函数)可以提供一个 花括号或等于符号初始化器


8

一个单独的构造函数可以覆盖它。

来自原始功能提案

有时候,数据成员通常具有特定值,但是少数专门的构造函数需要知道该值。如果构造函数显式地初始化某个成员,则构造函数初始化将覆盖成员初始化,如下所示:[...]

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接