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

2021-07-02 03:08:08 字數 1171 閱讀 2371

宣告乙個空的類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分配新的空間時記憶體不足丟擲錯誤,此時原先的例項不再保持有效的狀態;像下面這種方法,建立乙個

臨時例項,則保證了安全性,同時交換指標也保證了原例項的空間能被釋放

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

c 的複製建構函式,賦值建構函式,有時候會有點暈,下面總結一下 首先來談一下複製建構函式 includeusing namespace std include includeclass a void fuction void show int main 解釋 定義了乙個類,資料成員有字元指標,和整型...

複製建構函式和賦值運算子

進行c 類設計時,如果不對複製建構函式和賦值運算子進行重寫的話,編譯器會預設呼叫預設函式。預設的複製建構函式和賦值運算子會造成許多問題。先看下面一段 include include class my string int my string num string 0 my string my str...

C 中拷貝(複製)建構函式和賦值運算子過載函式

c 中拷貝建構函式和賦值運算子過載函式何時呼叫?先看下面的程式 include using namespace std class d public d cout 呼叫d的無參建構函式 呼叫d的無參建構函式 呼叫d的拷貝建構函式 輔助函式 呼叫d的拷貝建構函式 呼叫d的析構函式 呼叫d的析構函式 呼...