C++析构函数调用顺序

文章目录


析构函数工作过程:

1、执行析构函数的函数体;

2、如果该类中拥有类对象成员,且类对象有析构函数,则以类对象成员声明次序的相反顺序调用其析构函数,销毁类对象成员;

3、按原来构造顺序的相反顶序向上依次调用基类的析构函数。

程序示例:

#include<iostream>
using namespace std;
class AA{
char c;
public:
	AA(char ch):c(ch){ cout<<C; }
	~AA(){ cout<<"a"; }
};
class BB{
	AA m1;
	AA m2;
public:
	BB():m2('p'),m1('q'){ cout<<"B";}
	~BB(){ cout<< "b"; }
};

int main(){
BB bb;
return O;}

在这里插入图片描述

【解析】

  1. 构造函数初始化列表仅指定用于初始化成员的值,不指定这些初始化执行的次序,成员初始化的次序是类定义中声明成员的次序,成员初始化完成后执行构造函数的函数体;所以程序中在创建BB对象时,首先初始化m1,再初始化m2。
  2. 由于m1、 m2都是AA对象,且有实参q、p,所以调用构造函数AA(cha ch),用ch初始化成员c后输出成员c的值,即输出 ‘q’ 、‘p’ ,再执行类B的函数体,输出 ‘B’; 程序执行结束时,系统会自动调用类的析构函数清理自己的成员。
  3. 析构函数工作过程:1、执行析构函数的函数体; 2、如果该类中拥有类对象成员,且类对象有析构函数,则以类对象成员声明次序的相反顺序调用其析构函数,销毁类对象成员; 3、按原来构造顺序的相反顶序向上依次调用基类的析构函数。所以程序运行结束时,首先调用B的析构函数并执行函数体,输出“b”﹔然后调用m2的析构函数,销毁m2成员,输出 ‘a’,再调用m1的析构函数,销毁m1成员,输出 ‘a’ ; 综上所述,程序运行的输出是:“qpBbaa”; 答案为D。

示例二:
有如下类声明:

class Base1{ };
class Base2{ };
class Derived: public Base2,public Base1{};

在一个Derived 对象消亡时,析构函数被调用的顺序是()。
在这里插入图片描述
【解析】
C++中,派生类构造函数都是先调用基类构造函数,再根据声明次序定义数据成员 ,另外对于多继承, 派生类的构造函数初始化列表中,基类构造函数是按照基类在派生类的派生列表中出现的次序调用的; 而析构函数是按构造函数运行顺序的逆序进行调用的 ,可知题目中析构函数的调用顺序为: 派生类Derived的析构函数,Base1的析构函数,Base2的析构函数; 答案为A。

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值