列出构造函数初始化中的求值顺序
List evaluation order in constructor initialization
我想知道为什么要按照对象声明的顺序调用构造函数
我读了这个问题,但是我没有得到那里作为评论指定的原因。
说明的原因是:
按成员声明顺序而不是按构造函数顺序构造的原因是,可以有多个构造函数,但只有一个析构函数。析构函数按相反的构造顺序销毁成员。
有人能解释一下吗?
-
子对象析构函数应该总是以与子对象构造函数相反的顺序调用(否则会有太多东西崩溃)
-
对象可以有多个构造函数,每个构造函数在列表中都有自己的子对象顺序
-
如果我们按照特定于每个对象构造函数的顺序调用子对象构造函数,我们将无法获得子对象析构函数的单一顺序。
-
因此,决定在声明顺序中有,这与不同对象构造函数中子对象的顺序无关。
c++中一个基本的语言设计原则是"不用的东西不花钱"。
它并没有被完美地应用,例如,人们需要为线程和异常付费,即使它们没有被使用。这也是为什么C语言仍然有很好的定位的原因之一。但一般来说,如果一种语言特性即使在不使用的地方也会带来一些成本,那么它就不存在。
确保销毁顺序与构造顺序相反对于正确性至关重要。但是,对于任意的构造顺序(可能在其他翻译单元中定义),这样做将导致动态建立销毁顺序的开销。而且这种代价很少能买到任何好处(例如,我从来没有需要不同构造函数的不同初始化顺序,而且我从1990年代就开始使用c++了)。
相关文章:
- 类内初始化与构造函数初始化列表的顺序
- 运算符 new 的执行顺序和构造函数的参数
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 用作成员构造函数参数的函数的求值顺序
- 函数中调用的构造函数的顺序
- 构造函数中初始化列表的计算顺序是否固定?
- 构造函数和析构函数的顺序
- 遵循 C++ 中的构造函数执行顺序
- 更改操作的构造函数顺序
- 构造函数的初始值设定项列表中的函数调用是否按顺序排序?
- 如何维护类成员的顺序,并且仍然有一个可工作的构造函数
- 在继承中更改构造函数的顺序
- C++:初始值设定项列表顺序中的构造函数
- 如何在使用 std::make_tuple 时避免构造函数的未定义执行顺序
- 程序不会按照构造函数进行顺序进行,从而导致非初始化的变量
- 构造函数的调用顺序
- 构造函数和析构函数调用的顺序
- 在虚拟继承中构造函数调用的顺序是什么
- STL 中构造函数调用的顺序