1. 程式人生 > >C++ 複製建構函式和賦值運算子過載函式

C++ 複製建構函式和賦值運算子過載函式

宣告一個空的類testsize,sizeof(testsize)為1,為其宣告建構函式和解構函式,依舊為1 建構函式不能使用關鍵字virtual,解構函式可以 一旦類中存在虛擬函式,就會為該類生成虛擬函式表,並在每一個例項中新增一個指向虛擬函式表的指標,從而大小為一個指標大小,32位機器上為4,64位機器上為8 複製建構函式     1. 呼叫時機:在三種情況下會呼叫複製建構函式     1) 一個物件作為函式引數,以值傳遞的方式傳入函式體             從而唯一的形參必須是引用,否則在複製函式內容呼叫複製建構函式,會造成永無休止的遞迴呼叫從而導致棧溢位             比如類A的複製建構函式A(A a){}; 這樣的形式是錯的     2) 一個物件作為函式返回值,以值傳遞的方式從函式返回     3) 一個物件用於給另外一個物件進行初始化     2. 預設複製建構函式:編譯器會自動生成一個複製建構函式,但是隻對普通成員進行賦值處理,對於靜態資料成員和動態成員沒有進行處理     3. 淺複製和深複製     1) 淺複製:在物件複製時,只對物件中的資料成員進行簡單的賦值,預設的複製建構函式就是淺複製     2) 深複製:在靜態資料成員和動態成員的處理,必須定義自己的建構函式,進行處理             比如動態成員指標,必須為其分配一個新的地址,並將該地址的值初始化;沒有進行這一步處理的話,兩個物件釋放的時候若解構函式有顯式釋放指標空間,則釋放同一個指標,會報錯 賦值運算子過載函式
    注意點:     1) 返回值型別為該型別的引用【保證連續賦值】     2) 傳入的引數的型別宣告為常量引用     3) 例項自身已有的記憶體管理【存在動態資料成員的話】     4) 需要判斷傳入的引數和當前例項是否同一個例項【通過地址判斷】,是的話則直接返回          上面這段程式碼考慮到了所提到的四個方面,但缺乏安全考慮;如果釋放了自身記憶體後,new分配新的空間時記憶體不足丟擲錯誤,此時原先的例項不再保持有效的狀態;像下面這種方法,建立一個臨時例項,則保證了安全性,同時交換指標也保證了原例項的空間能被釋放