首页 > 解决方案 > 为什么用户提供的默认构造函数会导致未初始化的成员?

问题描述

请考虑以下代码:

#include <iostream>

struct A{ // with implicit default constructor
       int number;
};

struct B{
       int number;
       B(){}; // user-provided default constructor
};

int main()
{
    A aa = {};
    B bb = {};

    std::cout << "aa.number: " << aa.number << std::endl;
    std::cout << "bb.number: " << bb.number << std::endl;    
}

在线运行代码 会产生以下输出:

aa.number: 0
bb.number: 19715

为什么 bb.number 未初始化?我认为使用 ={} 可以保证零初始化?

标签: c++

解决方案


我认为使用 ={} 可以保证零初始化?

仅当类型“正确”时才如此,而事实B并非如此。 B bb = {};将默认构造 aB并且您的默认构造函数 ,B(){};不会初始化number,因此无论如何,number永远不会初始化,因为这是您的默认构造函数的工作方式。如果您有一个“正确”的构造函数,例如

B() : number(0) {};
// or use
int number = 0;
B(){};

然后你会number在默认构造时得到零初始化。

情况并非如此,A因为A它是一个聚合,并且如果使用空的括号初始化列表(the 的技术名称){},则它们具有某些保证,例如零初始化。


推荐阅读