为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
繁星点点滴滴 2019-12-26 11:11:01
哦,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::AB::BC::CC::~B::~A::~换句话说,是否保证成员按声明顺序初始化并以相反的顺序销毁?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

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

双方都同意。见12.6.2

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

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

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

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

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


查看完整回答
反对 回复 2019-12-26
?
大话西游666

TA贡献1817条经验 获得超14个赞

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


查看完整回答
反对 回复 2019-12-26
?
POPMUISE

TA贡献1765条经验 获得超5个赞

是的,该标准保证对象以与创建对象相反的顺序被破坏。原因是一个对象可能使用另一个对象,因此依赖于它。考虑:


struct A { };


struct B {

 A &a;

 B(A& a) : a(a) { }

};


int main() {

    A a;

    B b(a);

}

如果a是之前破坏b,然后b将举行无效成员引用。通过以创建对象的相反顺序破坏对象,我们保证正确破坏。


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 577 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信