C ++中的默认初始化

时间:2011-06-06 12:02:23

标签: c++ initialization pod

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

让我说我有:

struct Foo
{
  int bar;
};

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

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

现在,如果我默认实例化FooFoo2Foo3

Foo foo;
Foo2 foo2;
Foo3 foo3;

在哪种情况下bar成员正确初始化

(好Foo3明显地明确地初始化它,并且这里只显示与Foo2的区别,所以问题主要是关于前两个。)

谢谢! :)

4 个答案:

答案 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是内置类型,因此Foo1Foo2的默认初始化将是未定义的。如果它是自定义类型,那么默认构造函数将被调用,但在这种情况并非如此。

课程:始终初始化变量。

答案 2 :(得分:2)

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

因此:

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

相同

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

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

答案 3 :(得分:1)

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

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