天天看點

C++中拷貝構造函數

拷貝構造函數主要需要考慮兩個問題:一個是什麼時候會調用拷貝構造函數,另一個是拷貝構造函數中的淺拷貝和深拷貝

問題1:

1、對象在建立時使用其他的對象初始化

CStudent b(a); //此時複制構造函數被用來建立執行個體b

CStudent c = a; //此時複制構造函數被用來在定義執行個體p時初始化c

2、對象作為函數的參數進行值傳遞時

return_value(a); //此時a作為函數的參數進行值傳遞,a入棧時會調用複制構造函數建立一個局部對象,與函數内的局部變量具有相同的作用域

需要注意的是,指派并不會調用複制構造函數,指派隻是指派運算符(重載)在起作用

d = a; //此時沒有複制構造函數的調用!

簡單來記的話就是,如果對象在聲明的同時将另一個已存在的對象賦給它,就會調用複制構造函數;如果對象已經存在,然後将另一個已存在的對象賦給它,調用的就是指派運算符(重載)

問題2:

預設的複制構造函數和指派運算符進行的都是淺拷貝,隻是簡單地複制字段,是以如果對象中含有動态配置設定的記憶體,就需要我們自己重寫複制構造函數或者重載指派運算符來實作深拷貝,確定資料的完整性和安全性。

下面通過一個理智來說明這個問題:

結果:

C++中拷貝構造函數
C++中拷貝構造函數

其中比較奇怪的是,return_value1其中傳回的是局部變量,這時沒有調用拷貝構造函數,而return_value直接傳回參數,這時調用了拷貝構造函數,這點比較奇怪,我還沒搞清楚,還有知道的同學明示。

本文參考:

C++:複制構造函數在什麼時候被調用

C++拷貝構造函數(深拷貝,淺拷貝)

繼續閱讀