c++ - 为什么用户提供的默认构造函数会导致未初始化的成员?
问题描述
请考虑以下代码:
#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 未初始化?我认为使用 ={} 可以保证零初始化?
解决方案
我认为使用 ={} 可以保证零初始化?
仅当类型“正确”时才如此,而事实B
并非如此。 B bb = {};
将默认构造 aB
并且您的默认构造函数 ,B(){};
不会初始化number
,因此无论如何,number
永远不会初始化,因为这是您的默认构造函数的工作方式。如果您有一个“正确”的构造函数,例如
B() : number(0) {};
// or use
int number = 0;
B(){};
然后你会number
在默认构造时得到零初始化。
情况并非如此,A
因为A
它是一个聚合,并且如果使用空的括号初始化列表(the 的技术名称){}
,则它们具有某些保证,例如零初始化。
推荐阅读
- plot - 使用 scilab 说明特殊功能
- python - Python re.findall() 除了一个变量
- qt - 如何将 QDockWidgets 停靠在 QSplitter 中?
- c# - 保护 ASP.NET Web API 服务的外部 API 端点 (ASP.NET 4.6)
- java - 如何计算三次贝塞尔曲线的切线?
- javascript - 在保存到 node.js 之前处理文件名
- visualization - 更改 Zeppelin 可视化中的默认组颜色
- php - PHP DateTime 差异倒计时
- drjava - 为什么我只有一个公共类和类文件时说我的公共类没有定义
- javascript - 检测 iOS 自动完成建议按键?