📜  C++中构造函数析构函数调用的顺序(1)

📅  最后修改于: 2023-12-03 14:59:50.090000             🧑  作者: Mango

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

在C++中,构造函数用于初始化类的成员变量,而析构函数用于清理对象的资源。在一个对象被创建或销毁时,构造函数和析构函数将自动被调用。在本文中,我们将讨论C++中构造函数和析构函数的调用顺序。

构造函数的调用顺序

在C++中,当创建一个对象时,构造函数将按照如下顺序被调用:

  1. 调用基类的构造函数。

  2. 调用成员变量的构造函数,按照它们在类中声明的顺序依次调用。

  3. 调用派生类的构造函数。

具体来说,首先调用基类的构造函数,然后调用成员变量构造函数,最后调用派生类的构造函数。下面是一个示例:

class Base {
public:
    Base() {
        std::cout << "Base constructor" << std::endl;
    }
};

class Member {
public:
    Member() {
        std::cout << "Member constructor" << std::endl;
    }
};

class Derived : public Base {
public:
    Derived() {
        std::cout << "Derived constructor" << std::endl;
    }

private:
    Member member_;
};

int main() {
    Derived d;
    return 0;
}

输出:

Base constructor
Member constructor
Derived constructor

我们可以看到,首先调用了基类的构造函数,然后是成员变量的构造函数,最后是派生类的构造函数。

析构函数的调用顺序

当对象被销毁时,析构函数同样需要按照一定的顺序来被调用。在C++中,析构函数的调用顺序是与构造函数相反的。具体来说,析构函数的调用顺序如下:

  1. 调用派生类的析构函数。

  2. 调用成员变量的析构函数,按照它们在类中声明的顺序依次调用。

  3. 调用基类的析构函数。

与构造函数相同,析构函数也是先调用派生类的析构函数,然后是成员变量的析构函数,最后是基类的析构函数。下面是一个示例:

class Base {
public:
    ~Base() {
        std::cout << "Base destructor" << std::endl;
    }
};

class Member {
public:
    ~Member() {
        std::cout << "Member destructor" << std::endl;
    }
};

class Derived : public Base {
public:
    ~Derived() {
        std::cout << "Derived destructor" << std::endl;
    }

private:
    Member member_;
};

int main() {
    Derived d;
    return 0;
}

输出:

Derived destructor
Member destructor
Base destructor

我们可以看到,首先调用了派生类的析构函数,然后是成员变量的析构函数,最后是基类的析构函数。

总结

在C++中,构造函数和析构函数的调用顺序会影响对象的创建和销毁过程。理解它们的调用顺序,可以帮助我们更好地管理对象的生命周期。