假设我有 A、B 和 C 类
如果我有容器如下
Container::Container()
:A(10),B(20),C(30)
{
//Do something specific
}
现在,如果我调用 Container 的析构函数,即 ~Container(),我注意到析构函数以相反的顺序被调用,即 ~C()、~B(),然后是 ~A()
这总是固定的顺序吗?任何人都可以更清楚地了解构造初始化集的析构函数的顺序吗?
假设我有 A、B 和 C 类
如果我有容器如下
Container::Container()
:A(10),B(20),C(30)
{
//Do something specific
}
现在,如果我调用 Container 的析构函数,即 ~Container(),我注意到析构函数以相反的顺序被调用,即 ~C()、~B(),然后是 ~A()
这总是固定的顺序吗?任何人都可以更清楚地了解构造初始化集的析构函数的顺序吗?
顺序是固定的,但不是由初始化列表决定的。
这是在类中声明成员的相反顺序。
class Container
{
A a;
B b;
C c;
};
当一个Container
对象被销毁时,成员被销毁的顺序是c
,b
和a
。
如果您以不同于声明的顺序初始化成员,一些编译器会警告您,并且保持一致性是件好事。
它们总是以与构造相反的顺序被破坏。构造顺序始终是声明顺序,与初始化列表中的顺序无关。
成员(和非虚拟子对象)按照声明它们的顺序构造,并以相反的顺序销毁。初始化器列表中初始化器的顺序是无关的,但强烈建议相同,只是为了让你自己和你周围的每个人都保持清醒。
想象一下你有这个: Foo(int n) : a(n), b(a) { }
. 这看起来不错,但如果Foo::b
实际上是在 之前声明Foo::a
的,这可能是未定义的行为(如果b
的构造函数需要完整的类型)。为了防止这种情况,您应该始终启用并遵守相关的编译器警告。