非静态数据成员初始化

Non-static data member initialization

根据C++标准,以下三种结构体定义有区别吗?

struct Foo
{
    int a;
};

struct Foo
{
    int a{};
};

struct Foo
{
    int a{0};
};

最后两个是C++11。

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 个不同。

更多详情,您可能需要阅读Initialization and Class Member Initialization

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

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

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

在 C++11 中,2 和 3 都不是 aggregates, but C++14 changes that rule,因此尽管添加了 brace-or-equal-initializer.

第一个是POD型。成员 a 由 0.

初始化