1.值傳遞
在C++中以下情會使用值傳遞:
函數形參
函數傳回值
對象指派=
因為對象的作用域不同,值傳遞是通過建立一個副本對象的方式管理。
2.對象副本
一個對象在記憶體中的展現是一段記憶體(可能不連續),那麼副本即時對象記憶體的複制。
3.拷貝構造函數
C++編譯器會隐式定義一個預設的複制構造函數,它是一個inline、public的成員函數,其原型形式為: 類名::類名(const 類名 &)
當對象進行值傳遞時,會調用拷貝構造函數建立副本,拷貝方式即記憶體複制。
4.缺陷1
前面說過副本是對象的記憶體拷貝,但是動态申請的記憶體并不屬于對象記憶體範圍,并不拷貝,又稱淺拷貝,這就造成2個對象同時指向一塊動态記憶體。當副本析構delete時,動态記憶體失效,此時造成記憶體錯誤。
5.其他缺陷
其他缺陷均是由于副本析構對原始對象造成的問題
6.對策
對策一:自定義拷貝構造函數,實作時考慮析構問題
對策二:限制使用值傳遞,自定義一個private 的拷貝構造函數,此後使用此類對象值傳遞時編譯器報錯------推薦使用,有引用何必用值傳遞