为什么类成员总是按照声明的顺序进行初始化
Why are class members always initialized in the order they are declared?
C++标准指出:
非静态数据成员应按其初始化顺序进行初始化 在类定义中声明(同样,无论 内存初始化器)。
为什么?如果成员按照它们在初始值设定项中出现的顺序进行初始化,然后默认为声明顺序(如果它们未在初始值设定项中列出),那不是更直观吗?
编辑回复:重复
另一个问题中接受的答案似乎不完整(我很高兴被证明是错误的,但我需要更多的解释。
它指出初始化始终按声明顺序的原因是,虽然可能有多个构造函数,但只能有一个析构函数,并且它需要使用声明来确定销毁顺序。
我明白为什么编译器需要使用声明顺序进行销毁,但我不明白为什么它需要在构造时严格执行相同的顺序。如果它们确实需要对称,为什么允许程序员任意定义初始值设定项的顺序。似乎如果成员必须以特定顺序初始化,则以不同的顺序编写初始值设定项应该是编译器错误。
在另一个 SO 问题的接受答案中有很好的解释
这种排序的原因是只有一个析构函数,它必须选择一个"反向顺序"来销毁类成员。在这种情况下,最简单的解决方案是使用类中的声明顺序来确保始终以正确的反向顺序销毁属性。
相关文章:
- lambda 作为接受其他参数的参数的初始化顺序
- 大括号或等于初始值设定项初始化顺序
- 类内初始化与构造函数初始化列表的顺序
- C++ 模板中的静态常量初始化顺序
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 视觉C++:在 DLL 加载期间,全局变量初始化顺序是否具有确定性?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 销毁 pthread 互斥体和 C++ 中的取消初始化顺序
- 线程局部变量的初始化顺序
- 初始化值是否保证通过其自己的地址反映,而不考虑内存顺序
- 类静态变量初始化顺序
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- 解析 CRTP 初始化顺序
- 初始化相等C++的顺序
- 内联初始化的静态 const 类成员的初始化顺序保证
- 使用constexpr的全局初始化顺序
- 初始化与类类型相同的静态成员(静态初始化顺序问题)
- 结构化绑定的标识符是否按顺序初始化?
- c++中的求值顺序初始化数组
- c++标准和C语言在哪里说的是一样的:编译单元(.cpp文件)中的变量是按照声明的顺序初始化的