删除聚合类的顺序是什么?

时间:2009-11-10 18:01:12

标签: c++

假设我有一个基本的A类聚合B和C:

class A  
{  
    B _b;  
    C _c;  
} 

_b和_c将被删除的顺序是什么? 我在某个地方读过这是他们分配的相反顺序 所以我想在这个小例子_c被删除之前_b,对吧?

现在,如果我有一个看起来像这样的A构造函数:

A::A():  
_c(...),  
_b(...)  
{  
}

_b和_c的构造函数以什么顺序调用?
如果_b的构造函数确实在_c之前被调用(关于它们在A中的顺序),那么我发现它真的反直觉!

在这种情况下,破坏的顺序是什么?

感谢您的帮助! :)

(旁注我似乎完全无法在Stackoverflow的编辑器中键入'}'。必须从外部编辑器复制和粘贴!)

3 个答案:

答案 0 :(得分:7)

非静态类成员总是以与构造它们相反的顺序销毁。

构造成员的顺序始终与它们在类定义中声明的顺序相匹配。成员在构造函数的初始化列表中出现的顺序对它们的构造顺序没有影响。

在您的示例中_c被销毁,然后_b被销毁,它们在类中的声明的顺序相反。

答案 1 :(得分:6)

它们以与创建它们相反的顺序被销毁(未删除)。这也要求无论构造函数如何编写,所有成员都必须以一致的顺序构造。如果每个构造函数都可以定义构造成员的顺序,则每个类实例都必须携带有关如何构造它的信息,以便能够以相反的顺序进行破坏。通过将顺序定义为始终是在类定义中声明成员的顺序,构造顺序不会从构造函数更改为构造函数。

在您的示例中,首先,为完整的A类分配内存。构建下一个_b,然后_c,然后A。如果A有一个基类,那将在上述任何一个之前完全构建。删除时,会发生相反的情况。调用第一个A的析构函数,然后_c被破坏,然后_b(然后任何基类被破坏)。最后释放'A'的记忆。

答案 2 :(得分:0)

类成员构造函数总是按其声明的顺序调用,无论master类构造函数中的调用顺序如何。

在你的情况下,

A::A():  
_c(...),  
_b(...)  
{  
}

表示与

相同的构造/销毁顺序
A::A():  
_b(...),
_c(...)  
{  
}