假设我有一个聚合B和C的基本A类:
class A
{
B _b;
C _c;
}
Run Code Online (Sandbox Code Playgroud)
以什么顺序_b和_c将被删除?
我在某个地方读过这是他们分配的相反顺序.
所以我想在这个小例子_c在_b之前被删除了吧?
现在,如果我有一个看起来像这样的A构造函数:
A::A():
_c(...),
_b(...)
{
}
Run Code Online (Sandbox Code Playgroud)
_b和_c的构造函数以什么顺序调用?
如果_b的构造函数确实在_c之前被调用(关于它们在A中的顺序),那么我发现它真的反直觉!
在这种情况下,破坏的顺序是什么?
谢谢你的帮助 !:)
(在旁注中我似乎完全无法在Stackoverflow的编辑器中键入'}'.必须从外部编辑器复制和粘贴!?)
非静态类成员总是以与构造它们相反的顺序销毁.
构造成员的顺序始终与它们在类定义中声明的顺序相匹配.成员出现在构造函数的初始化列表中的顺序对其构造顺序没有影响.
在你的例子中_c被销毁,然后_b被销毁,它们在类中声明的顺序相反.
它们以与创建它们相反的顺序被销毁(未删除).这也要求无论构造函数如何编写,所有成员都必须以一致的顺序构造.如果每个构造函数都可以定义构造成员的顺序,则每个类实例都必须携带有关如何构造它的信息,以便能够以相反的顺序进行破坏.通过将顺序定义为始终是在类定义中声明成员的顺序,构造顺序不会从构造函数更改为构造函数.
在您的示例中,首先,为完整的A类分配内存.接下来_b构建,_c然后A.如果A有一个基类,那将在上述任何一个之前完全构建.删除时,会发生相反的情况.第A一个析构函数被调用,然后_c被破坏,然后_b(然后任何基类被破坏).最后释放'A'的内存.