为什么即使base具有用户声明的构造函数,也会发生零初始化?

tem*_*boy 5 c++

这打印0,意思data是零初始化.为什么即使base有用户声明的构造函数也会发生这种情况?

struct base
{
    base() { }
    int data;
};

struct derived : base
{
    derived() = default;
};

int main()
{
    std::cout << derived().data;
}
Run Code Online (Sandbox Code Playgroud)

如果derived有一个用户声明的构造函数,那么它会输出一个随机值.为什么零初始化取决于派生类而不是基类?

小智 11

这些规则是专门为覆盖而编写的

struct S {
  int i;
  std::string s;
};
Run Code Online (Sandbox Code Playgroud)

在没有任何用户提供的构造函数的情况下,即使隐式生成的默认构造函数是非平凡的,S().i也将进行零初始化.这不能依赖于构造函数int,因为int没有任何构造函数.决定让它依赖于类S是否具有用户提供的构造函数.它没有太多可以依赖的东西.

你所看到的只是一个简单的结果.您的类derived也没有用户提供的构造函数,因此初始化也为零.

  • 实际上,将`derived`的构造函数更改为`derived():base(){}`(即使其成为用户提供的构造函数)会导致未初始化的`data`成员. (3认同)