天天看點

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) 需要判斷傳入的參數和目前執行個體是否同一個執行個體 【通過位址判斷】,是的話則直接傳回     

C++ 複制構造函數和指派運算符重載函數

    上面這段代碼考慮到了所提到的四個方面,但缺乏安全考慮;如果釋放了自身記憶體後,new配置設定新的空間時記憶體不足抛出錯誤,此時原先的執行個體不再保持有效的狀态;像下面這種方法,建立一個 臨時執行個體,則保證了安全性,同時交換指針也保證了原執行個體的空間能被釋放     

C++ 複制構造函數和指派運算符重載函數

繼續閱讀