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