构造函数、析构函数、初始化列表中声明顺序

文章讲述了C++中,当使用基类指针创建派生类对象时,构造函数和析构函数的执行顺序,以及初始化列表遵循的规则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 代码如下图,请问以下代码实际运行结果是什么()

#include <iostream>
class Base {
public:
	Base(const char* p_szName) :m_szName(p_szName) { std::cout << m_szName << ","; }
	virtual ~Base() { std::cout << "~" << m_szName << ","; }

private:
	const char* m_szName;
};

class Derived :public Base {
public:
	Derived(const char* p_szName) :m_szName(p_szName),
		m_objA((const char*)"A"),
		m_objB((const char*)"B"),
		m_objE((const char*)"E"),
		m_objF((const char*)"F"),
		m_objG((const char*)"G"),
		Base((const char*)"C")
	{
		std::cout << m_szName << ",";
	}
	virtual ~Derived() {
		std::cout << "~" << m_szName << ",";
	}

private:
	const char* m_szName;
	Base m_objE;
	Base m_objG;
	Base m_objF;
	Base m_objB;
	Base m_objA;
};

int main()
{
	Base* p = new Derived("D");
	delete p;
	return 0;
}

代码的主函数中创建了一个指向Derived类的Base类指针,传入参数‘D’;

首先调用Derived的有参构造函数,在初始化列表中,分别初始化了参数m_szName;对象m_objA,m_objB,m_objE,m_objF,m_objG;Base类对象;

初始化列表中的顺序为m_objAj>>m_objBj>>m_objEj>>m_objFj>>m_objGj>>Base对象;

Derived类中的声明顺序为m_obj>>m_objBj>>m_objEj>>m_objFj>>m_objGj;

但是调用规则

(1)按照基类对象派生类进行调用;

(2)初始化列表中对象调用顺序需要按照类中声明顺序

因此:

首先调用Base类的构造函数,打印输出‘C’;

之后调用初始化对象的构造函数按照声明顺序,依次打印‘E’,‘G’,‘F’,‘B’,‘A’;

析构的调用与构造的调用正好相反。

打印输出为:

C,E,G,F,B,A,D,~D,~A,~B,~F,~G,~E,~C。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值