简单来说,其构造函数的顺序就一句话:
基类构造函数 -> 成员的构造函数 -> 构造函数体内语句
看下面一个代码示例:
#include <iostream>using namespace std;class A {public:A() {cout << "A()" << endl; }~A() {cout << "~A()" << endl; }};class B {public:B(int b) {cout << "B(" << b << ")" << endl; }~B() {cout << "~B()" << endl; }};class C {public:C(int c) {cout << "C(" << c << ")" << endl; }~C() {cout << "~C()" << endl; }};class D {public:D() {cout << "D()" << endl; }~D() {cout << "~D()" << endl; }};class E: public B, public A {public:D d;C c;E(): c(3), B(5) {cout << "E()" << endl; }~E() {cout << "~E()" << endl; }};int main(){E e;return 0;}
你能看出这份代码的输出吗?
依照上面提到的,首先应该执行的是基类的构造函数。不过 C++ 语言是支持多继承的,那么当某个类继承多个类时,其构造顺序又是怎样的呢?答案是:简单的依照继承的顺序构造。
接下来,就会执行其成员变量的构造函数,这个顺序也很简单,就是依照类代码中成员变量的顺序依次执行的。
最后才会执行构造函数中的具体代码。
注意,在上述过程中,执行的顺序与构造函数参数的顺序无关。
通过 new 创建一个对象会调用其构造函数,通过 delete 删除一个对象会调用其析构函数。
如果没有显示的使用 delete 删除一个对象的话,析构函数执行的顺序与构造函数的顺序相反。
所以,上述代码的输出就是:
B(5)A()D()C(3)E()~E()~C()~D()~A()~B()
原文链接:/archives/51/