我想知道构造函数按声明对象的顺序调用的原因。
我读了这个question,但我没有将其中的原因作为评论。
说明理由是:
它们在成员声明顺序中而不是在构造函数中的顺序构造的原因是,可能有几个构造函数,但只有一个析构函数。析构函数以相反的构造顺序销毁成员。
有人可以解释一下吗?
答案 0 :(得分:7)
与子对象构造函数相比,应始终以相反的顺序调用子对象析构函数(否则太多东西会分崩离析)
对象可以有多个构造函数,每个构造函数都有自己的列表中的子对象顺序
如果我们按照特定于每个对象构造函数的顺序调用子对象构造函数,我们将无法为子对象析构函数获取单个订单。
因此,决定按声明顺序排列,不依赖于不同对象构造函数中子对象的顺序。
答案 1 :(得分:1)
C ++中的基本语言设计原则是“你不为你不使用的东西买单”。
它没有完美应用,例如一个确实为线程付费,对于例外,即使它们没有被使用。这仍然是C仍然有一个良好的利基的一个原因。但总的来说,如果一个语言特征即使在不使用它的情况下会产生一些成本,那么它就不存在了。
确保销毁订单与施工顺序相反对于正确性至关重要。但是,对于可能在其他翻译单元中定义的任意施工订单,这样做会产生动态建立的销毁订单的开销。而且这个成本很少会占据任何优势(例如,我从来没有为不同的构造函数需要不同的初始化顺序,而且自1990年代以来我就使用过C ++。)