C++中的默认初始化

Default initialization in C++

本文关键字:初始化 默认 C++      更新时间:2023-10-16

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

假设我有:

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的区别,所以问题主要是关于前两个。)

谢谢!:)

所有上下文中只有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是内置类型,因此Foo1Foo2的默认初始化将未定义。如果它是一个自定义类型,那么就会调用默认构造函数,但这里的情况并非如此。

教训:始终初始化变量。

用例3是正确的方法,它有一个成员初始化列表。

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

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

因此:

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

我找不到C++标准的各个部分,但如果完全跳过初始化器,那么POD类型就不应该默认初始化(不像非POD类型那样)。

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