天天看點

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

1.值傳遞

在C++中以下情會使用值傳遞:

函數形參

函數傳回值

對象指派=

因為對象的作用域不同,值傳遞是通過建立一個副本對象的方式管理。

2.對象副本

一個對象在記憶體中的展現是一段記憶體(可能不連續),那麼副本即時對象記憶體的複制。

3.拷貝構造函數

C++編譯器會隐式定義一個預設的複制構造函數,它是一個inline、public的成員函數,其原型形式為: 類名::類名(const 類名 &)

當對象進行值傳遞時,會調用拷貝構造函數建立副本,拷貝方式即記憶體複制。

4.缺陷1

前面說過副本是對象的記憶體拷貝,但是動态申請的記憶體并不屬于對象記憶體範圍,并不拷貝,又稱淺拷貝,這就造成2個對象同時指向一塊動态記憶體。當副本析構delete時,動态記憶體失效,此時造成記憶體錯誤。

5.其他缺陷

其他缺陷均是由于副本析構對原始對象造成的問題

6.對策

對策一:自定義拷貝構造函數,實作時考慮析構問題

對策二:限制使用值傳遞,自定義一個private 的拷貝構造函數,此後使用此類對象值傳遞時編譯器報錯------推薦使用,有引用何必用值傳遞

繼續閱讀