在我們定義一個空類時,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,調用拷貝構造函數。關於這一點,我們可以動手寫一個小實驗很好的看出來函數的執行順序。
第四行,a3 = a2,調用的是賦值操作符。
在一個空類中,其大小是1而非0。
拷貝構造函數和賦值操作符應該算是這幾個當中容易混淆的概念吧,其區別如下:
1)拷貝構造函數是一個對象初始化一塊內存區域,這塊內存就是新對象的內存區,而賦值函數是對於一個已經被初始化的對象來進行賦值操作。
2)拷貝構造函數首先是一個構造函數,它調用時候是通過參數的對象初始化產生一個對象。賦值函數則是把一個新的對象賦值給一個原有的對象,所以如果原來的對象中有內存分配要先把內存釋放掉,而且還要檢查一下兩個對象是不是同一個對象,如果是,不做任何操作,直接返回。
閱讀更多 一個程序員的奮鬥史 的文章