为什么类成员总是按照声明的顺序进行初始化

Why are class members always initialized in the order they are declared?

本文关键字:顺序 初始化 声明 成员 为什么      更新时间:2023-10-16

C++标准指出:

非静态数据成员应按其初始化顺序进行初始化 在类定义中声明(同样,无论 内存初始化器)。

为什么?如果成员按照它们在初始值设定项中出现的顺序进行初始化,然后默认为声明顺序(如果它们未在初始值设定项中列出),那不是更直观吗?

编辑回复:重复

另一个问题中接受的答案似乎不完整(我很高兴被证明是错误的,但我需要更多的解释。

它指出初始化始终按声明顺序的原因是,虽然可能有多个构造函数,但只能有一个析构函数,并且它需要使用声明来确定销毁顺序。

我明白为什么

编译器需要使用声明顺序进行销毁,但我不明白为什么它需要在构造时严格执行相同的顺序。如果它们确实需要对称,为什么允许程序员任意定义初始值设定项的顺序。似乎如果成员必须以特定顺序初始化,则以不同的顺序编写初始值设定项应该是编译器错误。

在另一个 SO 问题的接受答案中有很好的解释

这种排序的原因是只有一个析构函数,它必须选择一个"反向顺序"来销毁类成员。在这种情况下,最简单的解决方案是使用类中的声明顺序来确保始终以正确的反向顺序销毁属性。