在C++中,类的构造和析构顺序遵循以下规则:
- 构造顺序:
- 基类优先于派生类进行构造。
- 在同一个类中,成员变量按照声明的顺序进行初始化。
- 对于多个基类的情况,会按照声明顺序来初始化。
- 析构顺序:
- 析构顺序与构造顺序相反。
- 派生类对象先于基类对象进行析构。
- 在同一个类中,成员变量按照声明顺序的逆序进行析构。
- 对于多个基类的情况,会按照声明顺序的逆序进行析构。
举个例子:
#include <iostream>
using namespace std;
class Base {
public:
Base() { cout << "构造基类对象\n"; }
~Base() { cout << "析构基类对象\n"; }
};
class Derived : public Base {
public:
Derived() { cout << "构造派生类对象\n"; }
~Derived() { cout << "析构派生类对象\n"; }
};
int main() {
Derived d;
return 0;
}
输出将会是:
复制代码构造基类对象
构造派生类对象
析构派生类对象
析构基类对象
对于成员变量,我们可以稍微修改一下代码:
#include <iostream>
using namespace std;
class Member {
public:
Member(const char* s) { cout << "构造成员对象: " << s << "\n"; }
~Member() { cout << "析构成员对象\n"; }
};
class WithMembers {
public:
WithMembers() : m2("m2"), m1("m1") { cout << "构造包含成员的对象\n"; }
~WithMembers() { cout << "析构包含成员的对象\n"; }
private:
Member m1;
Member m2;
};
int main() {
WithMembers wm;
return 0;
}
你会看到如下的输出:
复制代码构造成员对象: m1
构造成员对象: m2
构造包含成员的对象
析构包含成员的对象
析构成员对象
析构成员对象
即使在构造函数中 m2
在 m1
之前初始化,m1
和 m2
的构造顺序还是按照它们在类中声明的顺序。同样,析构顺序与构造顺序相反。