use*_*988 10 c++ constructor destructor
我正在尝试一个关于基类和成员构造和破坏的代码,我对构造函数和析构函数的一些顺序感到困惑,这段代码的输出是:
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
Run Code Online (Sandbox Code Playgroud)
看到前四行,但我应该下令
Base1 constructor
Derived1 constructor
Member1 constructor
Member2 constructor
Run Code Online (Sandbox Code Playgroud)
谁能给我一些解释?
#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;
} ///:~
Run Code Online (Sandbox Code Playgroud)
构造函数在层次结构中向上调用:
- base class member objects
- base class constructor body
- derived class member objects
- derived class constructor body
Run Code Online (Sandbox Code Playgroud)
输出是正确的.
让我们简化您的代码:
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;
Run Code Online (Sandbox Code Playgroud)
当d被创建,它会首先创建的Base一部分.在进入构造函数体之前,将初始化所有成员对象.BaseMember初始化的第一个对象也是如此.
接下来,输入构造函数Base.
之前,Derived进入的构造函数,成员对象Derived被初始化,所以DerivedMember创建,下一个Derived构造函数被调用.
这是因为当您输入派生类的构造函数体时,必须完全初始化基类和成员对象.
编辑正如Matthieu所指出的,成员对象初始化的顺序由它们在类定义中出现的顺序指定,而不是它们在初始化列表中出现的顺序.
| 归档时间: |
|
| 查看次数: |
2253 次 |
| 最近记录: |