如何确保数据成员被初始化为一个值而不是保留默认初始化?

问题描述 投票:0回答:4

今天早上我问自己一些问题,但我找不到合适的词来“谷歌”:

假设我有:

struct Foo
{
  int bar;
};

struct Foo2
{
   int bar;
   Foo2() {}
};

struct Foo3
{
   int bar;
   Foo3() : bar(0) {}
};

现在,如果我默认初始化

Foo
Foo2
Foo3

Foo foo;
Foo2 foo2;
Foo3 foo3;

在哪种情况下,

bar
成员正确初始化,意味着它的值不是不确定的?


注意:

Foo3
显然已初始化。这里只是为了显示与
Foo2
的区别,所以问题主要是关于前两个。

c++ class initialization language-lawyer default-initialization
4个回答
32
投票

只有 foo3 会出现在所有上下文中。如果 foo2 和 foo 具有静态持续时间,则它们将是。请注意,Foo 类型的对象在其他上下文中可能会被零初始化:

Foo* foo = new Foo(); // will initialize bar to 0
Foo* foox = new Foo; // will not initialize bar to 0

而 Foo2 不会:

Foo2* foo = new Foo2(); // will not initialize bar to 0
Foo2* foox = new Foo2; // will not initialize bar to 0

这个区域很棘手,C++98 和 C++03 之间的措辞发生了变化,IIRC 又与 C++0X 发生了变化,所以我不会依赖它。

struct Foo4
{
   int bar;
   Foo4() : bar() {}
};

bar 也将始终被初始化。


10
投票

由于

bar
是内置类型,因此
Foo1
Foo2
的默认初始化将是未定义的。如果它是自定义类型,那么将调用默认构造函数,但这里不是这种情况。

教训:始终初始化变量。


1
投票

情况3是正确的方法,带有成员初始化列表。

前两个都不会被正确初始化,因为你没有给它们一个初始值(就像只定义的变量没有初始化一样)。


1
投票

对于 pod 类型,默认初始化是零初始化。

因此:

Foo() : b() {}
Foo() : b(0) {}

相同

我找不到 C++ 标准的相应部分,但如果完全跳过初始化程序,那么 POD 类型不应该默认初始化(与非 POD 类型不同)。

因此,在您的情况下,只有第三个示例被正确初始化。

© www.soinside.com 2019 - 2024. All rights reserved.