[英]Why does the order of destruction for data member matter?
我在一些书中看到,类中数据成员的销毁顺序应该与它们的构造顺序相反。 这条规则的原因是什么? 任何例子都表示赞赏。
这在很大程度上是为了保持一致性。 当按顺序创建多个对象时,它们总是以相反的顺序销毁。 例如,请考虑以下带有自动变量的示例:
{
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) { }
};
请注意,让数据成员互相引用通常不是一个好主意,但它既可能也可能偶尔有用。
我想也许你误会了。 这不是成员应该按此顺序销毁,而是指定成员 。
在极少数情况下,了解项目被销毁的顺序非常重要。
无论如何,这就是物体被摧毁的顺序,你无能为力,但知道它正在发生的事情。
C ++中的生命周期尽可能地嵌套。 虽然通常很少,但数据成员可以直接相互依赖(例如,将指针传递给另一个)或间接地(例如,两者都依赖于全局,例如将输出写入stderr),但即使它们不在t,拥有一个指定的顺序是很好的,并且嵌套更符合其他语言的工作方式(例如在函数范围内的生命周期),而不是其他顺序。
当然,遵循标准中的“as-if”规则,如果编译器/实现可以确定用户代码无法观察破坏重新排序,那么它可以按照自己喜欢的方式进行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.