MST

星途 面试题库

面试题:C++ 中构造函数与析构函数调用顺序示例分析

假设有如下 C++ 代码: ```cpp class Base { public: Base() { std::cout << "Base constructor" << std::endl; } ~Base() { std::cout << "Base destructor" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor" << std::endl; } ~Derived() { std::cout << "Derived destructor" << std::endl; } }; int main() { Derived d; return 0; } ``` 请描述程序运行时构造函数与析构函数的调用顺序,并解释原因。
38.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 调用顺序
    • 首先调用Base类的构造函数。
    • 然后调用Derived类的构造函数。
    • 程序结束时,先调用Derived类的析构函数。
    • 最后调用Base类的析构函数。
  2. 原因
    • 构造函数调用顺序:在创建派生类对象时,需要先初始化其基类部分。因为派生类对象包含基类的子对象,所以要先调用基类的构造函数来初始化这部分数据成员,然后再调用派生类自身的构造函数来初始化派生类特有的数据成员。所以Base类的构造函数先于Derived类的构造函数调用。
    • 析构函数调用顺序:析构函数的调用顺序与构造函数相反。当派生类对象被销毁时,首先要销毁派生类特有的部分,所以先调用派生类的析构函数,然后再销毁基类部分,即调用基类的析构函数。这确保了对象的资源能够按照正确的顺序释放,避免内存泄漏等问题。

所以程序运行时构造函数与析构函数的调用顺序如上述所描述。