1. 程式人生 > >C++中的建構函式,拷貝建構函式和賦值函式

C++中的建構函式,拷貝建構函式和賦值函式

一.建構函式
1.首先說明一下空類:
對於空類,編譯器會自動加入:
預設建構函式,拷貝建構函式,賦值建構函式,解構函式和取值函式
擴充:空類的大小為1.(因為每個例項在記憶體中都有獨一無二的地址,為了達到這個目的,編譯器往往會給空類增加一個位元組)

2.建構函式是一種特殊的類成員函式,是當建立一個類的物件時,它被呼叫來對類的資料成員進行初始化和分配記憶體。(建構函式的命名必須和類名完全相同)

二.拷貝建構函式
1.拷貝建構函式是C++獨有的,它是一種特殊的建構函式,用基於同一類的一個物件構造和初始化另一個物件。
(eg)
A a;
A b(a);
A b=a; 都是拷貝建構函式來建立物件b
強調:這裡b物件是不存在的,是用a 物件來構造和初始化b的!!

2.那麼什麼時候拷貝建構函式會被呼叫呢?
1)物件以傳值得方式傳入函式體
2)物件以值傳遞得方式從函式返回
3)一個物件需要通過另外一個物件進行初始化

3.什麼時候編譯器會生成預設得拷貝建構函式?
1)如果使用者沒有自己定義拷貝建構函式,並且在程式碼中使用到了拷貝建構函式。
2)如果使用者定義了一個建構函式,但不是拷貝建構函式,而此程式碼中又使用到了拷貝建構函式。

4.對於淺拷貝和深拷貝(如果物件中用到了需要手動釋放的物件,則會出現問題,這時就要手動過載拷貝建構函式,實現深拷貝。
淺拷貝:就是指標指向同一個內容,但所指向得空間並沒有賦值,而是由兩個物件共用。
深拷貝:如果在複製這個物件得時候,為新物件建立了獨立得空間。

5.拷貝建構函式得過載宣告如下:
A (const A&other)

三.賦值函式
1.當沒有過載賦值函式時,通過預設賦值函式來進行賦值
A a;
A b;
b=a;
強調:這裡a,b物件是已經存在的,是用a 物件來賦值給b的!!

2.賦值運算得過載宣告如下:
A& operator = (const A& other)

3.拷貝建構函式和賦值函式得區別:
1)拷貝建構函式是一個物件初始化一塊記憶體區域,這塊記憶體就是新物件得記憶體區,而賦值函式是對於一個已經被初始化了的物件進行賦值操作。
eg:
class A;
A a;
A b=a; //呼叫拷貝建構函式(b不存在)
A c(a) ; //呼叫拷貝建構函式
/**

/
class A;
A a;
A b;
b = a ; //呼叫賦值函式(b存在)

2)一般來說在資料成員包含指標物件的時候,需要考慮兩種不同的處理需求:一種是複製指標物件,另一種是引用指標物件。拷貝建構函式大多數情況下是複製,而賦值函式是引用物件

3)實現不一樣。拷貝建構函式首先是一個建構函式,它呼叫時候是通過引數的物件初始化產生一個物件。賦值函式則是把一個新的物件賦值給一個原有的物件,所以如果原來的物件中有記憶體分配要先把記憶體釋放掉,而且還要檢察一下兩個物件是不是同一個物件,如果是,不做任何操作,直接返回。

4.一句話記住三者:
**物件不存在,且沒用別的物件來初始化,就是呼叫了建構函式;
物件不存在,且用別的物件來初始化,就是拷貝建構函式(上面說了三種用它的情況!)
物件存在,用別的物件來給它賦值,就是賦值函式。**