2

假设我有 A、B 和 C 类

如果我有容器如下

Container::Container()
:A(10),B(20),C(30)
{
   //Do something specific
}

现在,如果我调用 Container 的析构函数,即 ~Container(),我注意到析构函数以相反的顺序被调用,即 ~C()、~B(),然后是 ~A()

这总是固定的顺序吗?任何人都可以更清楚地了解构造初始化集的析构函数的顺序吗?

4

3 回答 3

7

顺序是固定的,但不是由初始化列表决定的。

这是在类中声明成员的相反顺序。

class Container
{
   A a;
   B b;
   C c;
};

当一个Container对象被销毁时,成员被销毁的顺序是c,ba

如果您以不同于声明的顺序初始化成员,一些编译器会警告您,并且保持一致性是件好事。

于 2012-08-02T06:48:38.497 回答
6

它们总是以与构造相反的顺序被破坏。构造顺序始终是声明顺序,与初始化列表中的顺序无关。

于 2012-08-02T06:48:55.157 回答
3

成员(和非虚拟子对象)按照声明它们的顺序构造,并以相反的顺序销毁。初始化器列表中初始化器的顺序是无关的,但强烈建议相同,只是为了让你自己和你周围的每个人都保持清醒。

想象一下你有这个: Foo(int n) : a(n), b(a) { }. 这看起来不错,但如果Foo::b实际上是在 之前声明Foo::a的,这可能是未定义的行为(如果b的构造函数需要完整的类型)。为了防止这种情况,您应该始终启用并遵守相关的编译器警告。

于 2012-08-02T06:50:10.447 回答