【问题标题】:Default initialization in C++C++ 中的默认初始化
【发布时间】:2011-06-06 12:02:23
【问题描述】:

今天早上我问自己一件事,但我找不到合适的词来“谷歌”:

假设我有:

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

谢谢! :)

【问题讨论】:

  • 澄清一下,foofoo2foo3 是在全局命名空间范围内还是在函数内?
  • @Charles Bailey:这是我刚刚为我的问题编写的示例代码:它没有任何实际意义。但是,我不知道这会有所作为。你能告诉我更多吗?
  • 我不确定,但这看起来像是一个相关问题:stackoverflow.com/questions/3930841/…

标签: c++ initialization


【解决方案1】:

只有 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 也将始终被初始化。

【讨论】:

  • 你能解释一下你所说的 foo2 和 foo 如果它们是静态持续时间的话是什么意思吗?
  • @Cupidvogel, static Foo foo;.
【解决方案2】:

由于bar 是一个内置类型,它的默认初始化对于Foo1Foo2 将是未定义的。如果它是自定义类型,则默认构造函数会被调用,但这里不是这样。

课程:始终初始化变量。

【讨论】:

  • 如果我理解你的话,原始类型或 POD 类型永远不会隐式初始化
  • 好吧,并非所有编译器都这样做,这个问题的答案可能会有所帮助:stackoverflow.com/questions/2417065/…
  • @ereOn:隐式初始化 不是一个常用术语,因此答案取决于您对该术语的特定解释。 default-initialization 不会设置 POD 类型的值,但 value-initialization 会。即POD p;不保证值,但POD p = {};(聚合初始化),或POD p = POD();POD p(( POD() ));会将所有成员值初始化为0(转换为每个成员的类型)
  • @David:确实我的术语在这里有点偏离。感谢您的解释,现在对我来说更有意义了。
【解决方案3】:

对于 pod-types,默认初始化是零初始化。

因此:

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

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

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

【讨论】:

【解决方案4】:

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

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

【讨论】:

  • 没错,反正我总是这样。但我的问题更多是关于另外两个,我有时会遇到,对此我无法做出任何判断。
猜你喜欢
  • 2017-11-21
  • 2020-02-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多