列出构造函数初始化中的评估顺序

List evaluation order in constructor initialization

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

我读了这个 question 但我没有得到评论中指定的原因。

声明的原因是:

之所以按照成员声明的顺序构造,而不是构造函数中的顺序,是因为一个构造函数可能有多个,而析构函数只有一个。并且析构函数以构造的相反顺序销毁成员。

有人可以解释一下吗?

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

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

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

  4. 因此,声明顺序的决定,不依赖于不同对象构造函数中子对象的顺序。

C++ 的一个基本语言设计原则是"you don't pay for what you don't use"。

它的应用并不完美,例如一个确实为线程和异常付费,即使它们没有被使用。这就是为什么 C 仍然有很好的利基市场的原因之一。但总的来说,如果一种语言功能即使在不使用的情况下也会产生一些成本,那么它就不存在了。

确保销毁顺序与构造顺序相反对于正确性至关重要。但是,对于可能在其他翻译单元中定义的任意构建顺序,这样做会产生动态建立的销毁顺序的开销。而且这种成本很少会带来任何优势(例如,我从来不需要为不同的构造函数使用不同的初始化顺序,而且我从 1990 年代就开始使用 C++)。