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

时间:2015-05-28 07:01:28

标签: c++ constructor

我想知道构造函数按声明对象的顺序调用的原因。

我读了这个question,但我没有将其中的原因作为评论。

说明理由是:

它们在成员声明顺序中而不是在构造函数中的顺序构造的原因是,可能有几个构造函数,但只有一个析构函数。析构函数以相反的构造顺序销毁成员。

有人可以解释一下吗?

2 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:1)

C ++中的基本语言设计原则是“你不为你不使用的东西买单”。

它没有完美应用,例如一个确实为线程付费,对于例外,即使它们没有被使用。这仍然是C仍然有一个良好的利基的一个原因。但总的来说,如果一个语言特征即使在不使用它的情况下会产生一些成本,那么它就不存在了。

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