今天早上我问自己一些问题,但我找不到合适的词来“谷歌”:
假设我有:
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
的区别,所以问题主要是关于前两个。
只有 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 也将始终被初始化。
由于
bar
是内置类型,因此 Foo1
和 Foo2
的默认初始化将是未定义的。如果它是自定义类型,那么将调用默认构造函数,但这里不是这种情况。
教训:始终初始化变量。
情况3是正确的方法,带有成员初始化列表。
前两个都不会被正确初始化,因为你没有给它们一个初始值(就像只定义的变量没有初始化一样)。
对于 pod 类型,默认初始化是零初始化。
因此:
Foo() : b() {}
与 Foo() : b(0) {}
相同
我找不到 C++ 标准的相应部分,但如果完全跳过初始化程序,那么 POD 类型不应该默认初始化(与非 POD 类型不同)。
因此,在您的情况下,只有第三个示例被正确初始化。