首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >成员构造函数和析构函数调用的顺序

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

Stack Overflow用户
提问于 2010-02-13 02:44:33
回答 3查看 59.3K关注 0票数 134

哦,C++大师,我在寻求你的智慧。对我说标准的话,告诉我C++是否保证下面的程序:

代码语言:javascript
复制
#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;
}

总是会产生

代码语言:javascript
复制
A::A
B::B
C::C
C::~
B::~
A::~

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

EN

回答 3

Stack Overflow用户

发布于 2010-02-13 02:47:43

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

票数 29
EN

Stack Overflow用户

发布于 2010-02-13 03:04:11

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

代码语言:javascript
复制
struct A { };

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

int main() {
    A a;
    B b(a);
}

如果ab之前进行析构,那么b将持有无效的成员引用。通过以与创建对象相反的顺序析构对象,我们可以保证正确的析构。

票数 15
EN

Stack Overflow用户

发布于 2010-02-13 02:47:24

是的,是的。对于成员变量,销毁的顺序总是与构造的顺序相反。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2254263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档