C++继承与组合关系中构造函数与析构函数执行顺序

/*
	测试继承与组合关系中构造函数与析构函数执行顺序
	在继承关系中:先调用基类构造函数,再调用子类构造函数
	针对包含自定义类型成员变量的情况,先构造成员变量,在调用自己的构造函数
	析构函数与构造函数调用顺序相反
*/
void Test_Constructor_Destructor_Sequence()
{
	cout << "Test_Constructor_Destructor_Sequence" << endl;
	// 测试包含继承关系和自定义成员变量的
	class A
	{
	public:
		A(){ cout << "A Constructor." << endl; }
		~A(){ cout << "A Destructor." << endl; }
	};

	class B
	{
	public:
		B(){ cout << "B Constructor." << endl; }
		~B(){ cout << "B Destructor." << endl; }
	};

	class C
	{
	public:
		C() { cout << "C Constructor." << endl; }
		~C(){ cout << "C Destructor." << endl; }
	};

	class D
	{
	public:
		D() : m_i_(0), m_b_(B()), m_a_(A()) { cout << "D Constructor 1." << endl; }
		D(int i) : m_i_(i){ cout << "D Constructor 2." << endl; }
		~D(){ cout << "D Destructor." << endl; }
	private:
		int m_i_;
		A m_a_;
		B m_b_;
	};

	class E : public D
	{
	public:
		E() : m_c_(C()), m_j(0) { cout << "E Constructor 1." << endl; }
		E(int i, int j) : D(i), m_j(j){ cout << "E Constructor 2." << endl; }
		~E(){ cout << "E Destructor." << endl; }
		E(const E& e){ cout << "E Copy Constructor." << endl; }
		E(const E&& e){ cout << "E Move Constructor." << endl; }
	private:
		int m_j;
		C m_c_;
	};

	{
		cout << "*1*" << endl;
		E e1;
		/*
		离开作用域输出结果:
			A Constructor.
			B Constructor.
			D Constructor 1.
			C Constructor.
			E Constructor 1.
			E Destructor.
			C Destructor.
			D Destructor.
			B Destructor.
			A Destructor.
		*/
	} 
	
	{
		cout << "*2*" << endl;
		E e2(1,2);
		/*离开作用域输出结果:
			A Constructor.
			B Constructor.
			D Constructor 2.
			C Constructor.
			E Constructor 2.
			E Destructor.
			C Destructor.
			D Destructor.
			B Destructor.
			A Destructor.
		*/
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值