C++ 为什么成员没有默认初始化?

时间:2021-03-15 23:05:10

标签: c++ constructor default-constructor

如果我有一个结构体 Foo 和一个结构体 Bar:

<span style="display:none">{{strtotime($date)}}</span>

如果我初始化一个 struct Foo { int a, b; }; struct Bar { Foo foo; int c; }; 并打印我正确得到的值:

Bar

但是现在如果我声明一个这样的构造函数:

int main() {
  Bar bar = {}; // I call the default constructor
  std::cout << bar.foo.a << " "; // 0
  std::cout << bar.foo.b << " "; // 0
  std::cout << bar.c << std::endl; // 0

  return 0;
}

我丢失了 struct Bar { Bar() : c(5) {} Foo foo; int c; }; 的默认构造,程序输出 Bar::foo

为什么我被迫像这样愚蠢地初始化每个成员变量:

32764 0 5

只要我声明一个构造函数?为什么在这种情况下默认构造不起作用?

1 个答案:

答案 0 :(得分:1)

在 C++ 中,如果你有一个默认构造函数,并且变量没有用初始化列表初始化,那么它默认构造为一个不确定的值。这是一个尚未修复的值得注意的行为,所以我认为它要么是有意的,要么更有可能被接受。

来自CPP Reference

<块引用>

注意事项

具有自动和动态存储持续时间的非类变量的默认初始化产生具有不确定值的对象(静态和线程局部对象初始化为零)

不能默认初始化引用和常量标量对象。

相关问题