1. 程式人生 > >包含物件成員的類的構造與析構順序

包含物件成員的類的構造與析構順序

首先,我們來看一段程式碼:

#include<iostream>
using namespace std;

class A
{
public:
	A()
	{
		cout << "A's constructor." << endl;
	}
	~A()
	{
		cout << "A's destructor." << endl;
	}
};

class B
{
public:
	B()
	{
		cout << "B's constructor." << endl;
	}
	~B()
	{
		cout << "B's destructor." << endl;
	}
};

class C
{
private:
	B bInC;
public:
	C()
	{
		cout << "C's constructor." << endl;
	}
	~C()
	{
		cout << "C's destructor." << endl;
	}
	A aInC;
};

class D:public C
{
public:
	D()
	{
		cout << "D's constructor." << endl;
	}
	~D()
	{
		cout << "D's destructor." << endl;
	}
	A aInD;
private:
	B bInD;
};

int main(void) {
	D d;
	return 0;
}

那麼,這段程式執行後,輸出什麼呢?
B's constructor.
A's constructor.
C's constructor.
A's constructor.
B's constructor.
D's constructor.
D's destructor.
B's destructor.
A's destructor.
C's destructor.
A's destructor.
B's destructor.

分析如下:

(1)存在繼承關係時,先執行父類的建構函式,再執行子類的建構函式;

(2)當一個類中含有物件成員時,在啟動本類的建構函式之前,先分配物件空間,按物件成員的宣告順序執行他們各自的建構函式,再繼續執行本類的建構函式;

(3)對於非靜態的區域性物件,他們的解構函式的執行順序與建構函式相反。

在本程式中:

(1)執行main(),需要建立一個物件d,所以,需要執行D的建構函式。而D繼承自C,所以先要執行C的建構函式;

(2)而在C中存在物件成員bInC和aInC,所以,在C的建構函式執行之前,先按宣告順序執行B和A的建構函式,然後執行C的建構函式;

(3)輪到構造d了,但是D中有物件成員aInD和bInD,所以,在D的建構函式執行之前,先按宣告順序執行A和B的建構函式,最後,執行D的建構函式;

(4)以上所有物件的解構函式以與建構函式的執行順序相反的順序執行。

最終的執行結果就不言而喻了。

學無止境,共同學習。若本文所述存在錯誤或不妥之處,歡迎指正~