C++中的默认初始化

ere*_*eOn 21 c++ initialization pod

今天早上我问自己一些事情,我找不到正确"谷歌"的话:

让我们说:

struct Foo
{
  int bar;
};

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

struct Foo3
{
   int bar;
   Foo3() : bar(0) {}
};
Run Code Online (Sandbox Code Playgroud)

现在,如果我默认实例化Foo,Foo2并且Foo3:

Foo foo;
Foo2 foo2;
Foo3 foo3;
Run Code Online (Sandbox Code Playgroud)

在哪种情况下,bar会员是否正确初始化

(Foo3显然很明显地初始化它,并且只在这里显示明确差异Foo2所以问题主要是关于前两个.)

谢谢 !:)

APr*_*mer 26

只有foo3才会出现在所有情况下.foo2和foo将是静态持续时间.请注意,Foo类型的对象可能在其他上下文中初始化为零:

Foo* foo = new Foo(); // will initialize bar to 0
Foo* foox = new Foo; // will not initialize bar to 0
Run Code Online (Sandbox Code Playgroud)

而Foo2不会:

Foo2* foo = new Foo2(); // will not initialize bar to 0
Foo2* foox = new Foo2; // will not initialize bar to 0
Run Code Online (Sandbox Code Playgroud)

该区域很棘手,C++ 98和C++ 03之间的措辞和IIRC再次使用C++ 0X,所以我不依赖它.

struct Foo4
{
   int bar;
   Foo4() : bar() {}
};
Run Code Online (Sandbox Code Playgroud)

bar也将始终初始化.


Jes*_*ond 9

既然bar是内置类型的默认初始化将被未定义Foo1Foo2.如果它是一个自定义类型,那么默认构造函数将被调用,但在这里并非如此.

课程:始终初始化变量.

  • @ereOn:*隐式初始化* 不是一个使用过的术语,因此答案将取决于您对该术语的特定解释。*default-initailization* 不会设置 POD 类型的值,但 *value-initialization* 会。即`POD p;`不保证值,而是`POD p = {};`(聚合初始化),或者`POD p = POD();`或者`POD p((POD()));`将所有成员的值初始化为“0”(转换为每个成员的类型) (2认同)