C++ 构造函数及析构函数的调用顺序

C++ 语言一直被批评太复杂了,很多细节的地方需要仔细推敲,甚至其构造函数和析构的调用顺序也成为了一个让人迷惑的问题,在此我做了简单的总结。

简单来说,其构造函数的顺序就一句话:

基类构造函数 -> 成员的构造函数 -> 构造函数体内语句

看下面一个代码示例:

#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()

标签: C/C++

添加新评论