我正在尝试有关基类和成员构造和销毁的代码,并且我对构造函数和析构函数的某些顺序感到困惑,
这段代码的输出是:
Base1 constructor
Member1 constructor
Member2 constructor
Derived1 constructor
Member3 constructor
Member4 constructor
Derived2 constructor
Derived2 destructor
Member4 destructor
Member3 destructor
Derived1 destructor
Member2 destructor
Member1 destructor
Base1 destructor
看前四行,
但我觉得顺序应该是
Base1 constructor
Derived1 constructor
Member1 constructor
Member2 constructor
任何人都可以给我一些解释吗?
#include "stdafx.h"
#include <fstream>
using namespace std;
ofstream out("order.out");
#define CLASS(ID) class ID { \
public: \
ID(int) { out << #ID " constructor\n"; } \
~ID() { out << #ID " destructor\n"; } \
};
CLASS(Base1);
CLASS(Member1);
CLASS(Member2);
CLASS(Member3);
CLASS(Member4);
class Derived1 : public Base1 {
Member1 m1;
Member2 m2;
public:
Derived1(int) : m2(1), m1(2), Base1(3) {
out << "Derived1 constructor\n";
}
~Derived1() {
out << "Derived1 destructor\n";
}
};
class Derived2 : public Derived1 {
Member3 m3;
Member4 m4;
public:
Derived2() : m3(1), Derived1(2), m4(3) {
out << "Derived2 constructor\n";
}
~Derived2() {
out << "Derived2 destructor\n";
}
};
int main() {
Derived2 d2;
} ///:~
构造函数在层次结构中向上调用:
- base class member objects
- base class constructor body
- derived class member objects
- derived class constructor body
输出是正确的。
让我们简化您的代码:
struct BaseMember
{
BaseMember() { cout << "base member" <<endl; }
};
struct Base
{
BaseMember b;
Base() { cout << "base" << endl; }
};
struct DerivedMember
{
DerivedMember() { cout << "derived member" << endl; }
};
struct Derived : public Base
{
DerivedMember d;
Derived() { cout << "derived" << endl; }
};
Derived d;
When d
创建时,它会首先创建Base
部分。在进入构造函数体之前,所有成员对象都被初始化。所以BaseMember
是第一个初始化的对象。
接下来,构造函数Base
已输入。
之前,构造函数Derived
输入,成员对象Derived
被初始化,所以DerivedMember
已创建,下一步Derived
构造函数被调用。
发生这种情况是因为当您进入派生类的构造函数主体时,基类和成员对象必须完全初始化。
EDIT正如 Matthieu 指出的,成员对象的初始化顺序是由它们在类定义中出现的顺序指定的,而不是它们在初始化列表中出现的顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)