析构函数调用

 我以前一直以为析构函数的调用顺序是:先调用的函数,也就害死先进行构造函数调用的函数先被析构。但昨天写了几行提示性语句后发现其实不然。应该是反过来的,最后被调用的反而是先进行的析构。(我想这下的认识应该是正确了的吧。)

昨天还遇见了析构和捕捉的问题。一开始编译时只显示了构造函数被调用的提示性语句,敲下回车键后,看见了析构函数被调用的提示语句,但一瞬间就退出了运行程序。我要的效果是再敲下回车键,再退出运行程序。最后发现用对象指针来做就不会这样了。最后使用delete操作符,也就意味着当运行到delete的时候,程序对之前调用的函数全部进行了析构,然后由cin.get()语句进行捕捉,就能看见所有的构造和析构函数调用提示语句。然后敲下回车,退出程序,成功!:Computer* computer = new Computer()

computer->run();

computer->stop();

delete computer;

cin.get();

### C++ 析构函数调用顺序规则解释 在 C++ 中,析构函数调用顺序遵循特定的规则,这些规则基于对象创建时构造函数的执行流程。以下是关于析构函数调用顺序的具体说明: #### 基本原则 1. **单继承情况下的析构函数调用顺序** 当一个派生类的对象销毁时,其析构函数会按照以下顺序被调用: - 首先调用派生类自身的析构函数[^1]。 - 接着按基类声明的顺序依次调用各个基类的析构函数。 2. **多继承情况下析构函数调用顺序** 如果存在多个基类,则析构函数调用顺序是构造函数运行顺序的逆序。具体来说: - 派生类的析构函数最先被执行。 - 然后按照基类在派生列表中出现的顺序反向调用各基类的析构函数。 3. **组合类中的析构函数调用顺序** 在涉及成员变量的情况下(即组合关系),析构函数调用顺序如下: - 成员对象的析构函数会在所属类的析构函数之后、基类析构函数之前被调用[^2]。 - 调用顺序与成员对象在其类中声明的顺序相反,也就是说最后声明的成员对象会被优先销毁。 #### 示例代码展示 下面通过一段代码来演示上述规则的应用场景: ```cpp #include <iostream> using namespace std; class Base1 { public: ~Base1() { cout << "~Base1()" << endl; } }; class Base2 { public: ~Base2() { cout << "~Base2()" << endl; } }; class MemberClass { public: ~MemberClass() { cout << "~MemberClass()" << endl; } }; class Derived : public Base1, public Base2 { private: MemberClass member; public: ~Derived() { cout << "~Derived()" << endl; } }; int main() { Derived d; return 0; } ``` 当 `d` 的生命周期结束时,程序输出的结果将是: ``` ~Derived() ~MemberClass() ~Base2() ~Base1() ``` 这表明: - 派生类 `Derived` 的析构函数首先被调用; - 继而调用了成员对象 `member` 的析构函数; - 最终按照基类在派生列表中出现的顺序倒序调用基类 `Base2` 和 `Base1` 的析构函数。 ### 总结 综上所述,在 C++ 中,析构函数总是以构造函数执行顺序的逆序进行调用。这一机制确保了资源释放过程的安全性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值