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

新手上路,请多包涵

哦,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::~

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

原文由 sbk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 706
2 个回答

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

两者都是。见 12.6.2

6 初始化应按以下顺序进行:

  • 首先,并且仅对于如下所述的最派生类的构造函数,虚拟基类应按照它们在基类的有向无环图的深度优先从左到右遍历中出现的顺序进行初始化,其中“左-to-right”是派生类基说明符列表中基类名称的出现顺序。

  • 然后,直接基类应按照它们出现在 base-specifier-list 中的声明顺序进行初始化(不管 mem-initializers 的顺序如何)。

  • 然后,非静态数据成员应按照它们在类定义中声明的顺序进行初始化(同样不管 mem-initializers 的顺序)。

  • 最后,执行构造函数主体的复合语句。 [注意:声明顺序是为了确保基子对象和成员子对象以初始化的相反顺序被销毁。 ——尾注]

原文由 dirkgently 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 AnT stands with Russia 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题