成员构造函数和析构函数调用的顺序

哦,C ++专家们,我寻求您的智慧。与我说标准话,并告诉我C ++是否保证以下程序:


#include <iostream>

using namespace std;


struct A

{

    A() { cout << "A::A" << endl; }

    ~A() { cout << "A::~" << endl; }

};


struct B

{

    B() { cout << "B::B" << endl; }

    ~B() { cout << "B::~" << endl; }

};


struct C

{

    C() { cout << "C::C" << endl; }

    ~C() { cout << "C::~" << endl; }

};


struct Aggregate

{

    A a;

    B b;

    C c;

};


int main()

{

    Aggregate a;

    return 0;

}

将永远产生


A::A

B::B

C::C

C::~

B::~

A::~

换句话说,是否保证成员按声明顺序初始化并以相反的顺序销毁?


繁星点点滴滴
浏览 554回答 3
3回答

慕雪6442864

换句话说,是否保证成员按声明顺序初始化并以相反的顺序销毁?双方都同意。见12.6.26初始化应按以下顺序进行:首先,并且仅对于如下所述的最大派生类的构造函数,虚拟基类应按照它们在基类的有向无环图的深度优先从左到右遍历时出现的顺序进行初始化,其中“左“从右到右”是基类名称在派生类base-specifier-list中的出现顺序。然后,直接基类应按照它们出现在base-specifier-list中的声明顺序进行初始化(与mem-initializers的顺序无关)。然后,非静态数据成员应按照它们在类定义中声明的顺序进行初始化(同样,无论mem-initializer的顺序如何)。最后,执行构造函数主体的复合语句。[注意:声明顺序是强制执行的,以确保以相反的初始化顺序销毁基础和成员子对象。—尾注]

大话西游666

是的,它们是(是非静态成员)。初始化(构造)请参见12.6.2 / 5,销毁请参见12.4 / 6。

POPMUISE

是的,该标准保证对象以与创建对象相反的顺序被破坏。原因是一个对象可能使用另一个对象,因此依赖于它。考虑:struct A { };struct B {&nbsp;A &a;&nbsp;B(A& a) : a(a) { }};int main() {&nbsp; &nbsp; A a;&nbsp; &nbsp; B b(a);}如果a是之前破坏b,然后b将举行无效成员引用。通过以创建对象的相反顺序破坏对象,我们保证正确破坏。
打开App,查看更多内容
随时随地看视频慕课网APP