我在一些书中看到,类中数据成员的销毁顺序应与其构造顺序的顺序相反。这条规则的原因是什么?任何例子都表示赞赏。
答案 0 :(得分:12)
这在很大程度上是为了保持一致性。当按顺序创建多个对象时,它们总是以相反的顺序销毁。例如,请考虑以下带有自动变量的示例:
{
A a;
B b(a);
} // b.~B() is called, then
// a.~A() is called
此处b
使用a
。通过保证对象按其构造的相反顺序销毁,C ++使对象生存期管理更多更容易。
在类中,您可以在初始化另一个数据成员时将引用传递给一个数据成员。确保以相反的顺序销毁对象,您将获得与自动变量相同的行为:
struct S
{
A a;
B b;
S() : a(), b(a) { }
};
请注意,让数据成员互相引用通常不是一个好主意,但它既可能也有可能有用。
答案 1 :(得分:5)
我想也许你误会了。这不是成员应该按此顺序销毁,而是指定。
在极少数情况下,了解项目被销毁的顺序非常重要。
无论如何,这就是对象被摧毁的顺序,你无能为力,但知道这就是正在发生的事情。
答案 2 :(得分:2)
C ++中的生命周期尽可能地嵌套。虽然通常很少,但数据成员可以直接相互依赖(例如,将指针传递给另一个)或间接地(例如,两者都依赖于全局,例如将输出写入stderr),但即使它们不在t,拥有一个指定的顺序是很好的,并且嵌套更适合于其他语言的工作方式(例如,在函数范围内的生命周期),而不是其他顺序。
当然,遵循标准中的“as-if”规则,如果编译器/实现可以确定用户代码无法观察破坏重新排序,那么它可以按照自己喜欢的方式进行。