构造函数和析构函数的调用顺序?

时间:2013-06-27 06:06:59

标签: c++ constructor destructor

假设我们有两个具有自动存储持续时间的对象:

{
   ClassA objA(...);
   ClassB objB(...);

   // [A] code that uses objA and objB.

   // [B] objA is no longer used after this point.

   // ... more code ...

}  // [C] objA and objB go out of scope.
  1. C ++标准是否指定了objAobjB的构造函数的相对顺序?例如,我们可以假设在objA的构造函数被调用时,objB的构造函数引起的任何副作用都会显示出来吗?
  2. 在[C]处将调用objAobjB的析构函数。这些析构函数是否有类似的排序要求?
  3. 最后,如果活跃度分析显示objA在点[B]之后已经死了,那么是否允许C ++编译器调用objA"早期"的析构函数,即代码中的[B]和[C]点?

2 个答案:

答案 0 :(得分:3)

  

1 C ++标准是否指定了objA和objB的构造函数的相对顺序?例如,我们可以假设当调用objB的构造函数时,objA的构造函数引起的任何副作用都是可见的吗?

是。 objA之前构建了objB

  

2在[C]中将调用objA和objB的析构函数。这些析构函数是否有类似的排序要求?

是的,objBobjA之前被销毁。破坏的顺序与建筑顺序相反。

  

3最后,如果活跃度分析显示objA在点[B]之后死了,是否允许C ++编译器为“早期”的objA调用析构函数,即代码中的点[B]和[C]之间?

如果有副作用,请勿使用。编译器必须遵循 as-if 规则。

澄清:as-if规则适用于上述所有三点。

答案 1 :(得分:2)

§6.6.2

  

退出范围(无论多么已完成)时,在该范围内构建的具有自动存储持续时间(3.7.3)的对象将在其构造的反向顺序中销毁。

几乎回答了这个参考文献中的所有三个问题。