列出构造函数初始化中的求值顺序

List evaluation order in constructor initialization

本文关键字:顺序 构造函数 初始化      更新时间:2023-10-16

我想知道为什么要按照对象声明的顺序调用构造函数

我读了这个问题,但是我没有得到那里作为评论指定的原因。

说明的原因是:

按成员声明顺序而不是按构造函数顺序构造的原因是,可以有多个构造函数,但只有一个析构函数。析构函数按相反的构造顺序销毁成员。

有人能解释一下吗?

  1. 子对象析构函数应该总是以与子对象构造函数相反的顺序调用(否则会有太多东西崩溃)

  2. 对象可以有多个构造函数,每个构造函数在列表中都有自己的子对象顺序

  3. 如果我们按照特定于每个对象构造函数的顺序调用子对象构造函数,我们将无法获得子对象析构函数的单一顺序。

  4. 因此,决定在声明顺序中有,这与不同对象构造函数中子对象的顺序无关。

c++中一个基本的语言设计原则是"不用的东西不花钱"。

它并没有被完美地应用,例如,人们需要为线程和异常付费,即使它们没有被使用。这也是为什么C语言仍然有很好的定位的原因之一。但一般来说,如果一种语言特性即使在不使用的地方也会带来一些成本,那么它就不存在。

确保销毁顺序与构造顺序相反对于正确性至关重要。但是,对于任意的构造顺序(可能在其他翻译单元中定义),这样做将导致动态建立销毁顺序的开销。而且这种代价很少能买到任何好处(例如,我从来没有需要不同构造函数的不同初始化顺序,而且我从1990年代就开始使用c++了)。