c++ - 类成员变量的初始化顺序
问题描述
考虑以下代码片段:
class A
{
public:
A(int a, int b) : j(a), i(j + b) {}
int i, j;
};
int main()
{
A a(10, 20);
std::cout << a.i << " " << a.j << std::endl;
return 0;
}
该标准规定成员变量的初始化顺序是它们被声明的顺序。在这种情况下,i
将在之前初始化j
。由于j
尚未初始化,i = *a garbage value* + 20
, 然后j
用 初始化10
。
代码打印 20 10
。
即,在计算时j
被认为是。0
i
标准是否保证在这种情况下使用内置类型的默认值?或者只是垃圾值恰好是0
?还是未定义的行为?
解决方案
j + b
j
是未定义的行为,因为它在允许这样做的特定实例之一之外使用不确定的值(在其初始化之前的值)(所有这些都与char
变体有关std::byte
,而不是int
不确定的值)。
在 C++20 中,它也会有未定义的行为,因为您是j
在它的生命周期之外访问的。据我所知,在 C++17 中以及在 的生命周期j
开始之前分配其存储空间,因为 的初始化j
是vacuous。但是,C++20 中的空初始化和生命周期的定义发生了变化。
因此,在任何情况下,在初始化之前使用变量都是非常不明智的。
推荐阅读
- sql - 生成分散数量的记录
- html - href链接不适用于绝对背景图像
- java - 遍历 .json 文件并打印 JAVA 中的所有值
- excel - 检测 Excel 应用程序、工作簿或工作表中的焦点丢失
- mainframe - 无法让 SDSF 响应 TSO 或批处理命令
- linux - Linux:如果目录存在于目标位置,如何移动和重命名目录?
- node.js - 如何计算 mongodb/express 中的文档数
- flutter - 无法让 InheritedWidget 与 StatefulWidget 一起使用
- java - 错误:尝试在空对象引用“android.database.Cursor com.myapplication.DatabaseHeleper.getData()”上调用虚拟方法
- javascript - onload 等待脚本在反应组件中加载完成?