c++基礎之空類背後的故事

在我們定義一個空類時,C++編譯器會默認在背後為我們完成一些事, 包括構造函數、析構函數、拷貝構造函數、拷貝賦值操作符。

c++基礎之空類背後的故事

空類

例如,當我們定義如下一個空類時,

class CEmpty

{

};

其隱含的,相當於

class CEmpty

{

public:

CEmpty(){} //默認構造函數

~CEmpty(){} //析構函數

CEmpty(const CEmpty &rhs){} //拷貝構造函數

CEmpty &operator = (const CEmpty &rhs){} //賦值操作符

}

其中構造函數可以被重載可以有多個可以帶參數

析構函數僅有一

個,且沒有參數

CEmpty a1;

CEmpty a2(a1);

CEmpty a3 = a1;

a3 = a2;

第一行CEmpty a1,很簡單,會調用默認構造函數。

第二行CEmpty a2(a1),會調用拷貝構造函數。

第三行CEmpty a3 = a1,調用拷貝構造函數。關於這一點,我們可以動手寫一個小實驗很好的看出來函數的執行順序。

c++基礎之空類背後的故事

函數執行順序

第四行,a3 = a2,調用的是賦值操作符。

在一個空類中,其大小是1而非0

拷貝構造函數和賦值操作符應該算是這幾個當中容易混淆的概念吧,其區別如下:

1)拷貝構造函數是一個對象初始化一塊內存區域,這塊內存就是新對象的內存區,而賦值函數是對於一個已經被初始化的對象來進行賦值操作。

2)拷貝構造函數首先是一個構造函數,它調用時候是通過參數的對象初始化產生一個對象。賦值函數則是把一個新的對象賦值給一個原有的對象,所以如果原來的對象中有內存分配要先把內存釋放掉,而且還要檢查一下兩個對象是不是同一個對象,如果是,不做任何操作,直接返回。


分享到:


相關文章: