非静态数据成员初始化

时间:2015-01-14 06:44:30

标签: c++ c++11

根据C ++标准,以下三种结构定义之间是否存在差异?

struct Foo
{
    int a;
};

struct Foo
{
    int a{};
};

struct Foo
{
    int a{0};
};

最后两个是C ++ 11。

3 个答案:

答案 0 :(得分:9)

根据第一个定义,如果您创建具有自动存储持续时间的Foo实例,a将被取消初始化。您可以执行聚合初始化来初始化它。

Foo f{0};  // a is initialized to 0

Foo的第二和第三个定义都会将数据成员a初始化为0

在C ++ 11中,2和3都不是aggregates,而是C ++ 14 changes that rule,所以尽管添加了大括号或等于初始值<,但它们都保持聚合状态/ em>的

答案 1 :(得分:4)

struct Foo
{
    int a;
}bar;
如果不是全局范围或非静态范围,则

bar.a未初始化。

struct Foo
{
    int a{};
}bar;

bar.a初始化为0

struct Foo
{
    int a{0};
}bar;

bar.a初始化为0

所以构造2和3是相同的。 1是不同的。

有关详细信息,您可能需要阅读InitializationClass Member Initialization

答案 2 :(得分:1)

第一个是POD类型。成员a初始化为0。