C 中拷貝建構函式

2021-06-26 08:51:41 字數 870 閱讀 6155

拷貝建構函式主要需要考慮兩個問題:乙個是什麼時候會呼叫拷貝建構函式,另乙個是拷貝建構函式中的淺拷貝和深拷貝

問題1:

1、物件在建立時使用其他的物件初始化

cstudent b(a); //此時複製建構函式被用來建立例項b

cstudent c = a; //此時複製建構函式被用來在定義例項p時初始化c

2、物件作為函式的引數進行值傳遞時

return_value(a); //此時a作為函式的引數進行值傳遞,a入棧時會呼叫複製建構函式建立乙個區域性物件,與函式內的區域性變數具有相同的作用域

需要注意的是,賦值並不會呼叫複製建構函式,賦值只是賦值運算子(過載)在起作用

d = a; //此時沒有複製建構函式的呼叫!

簡單來記的話就是,如果物件在宣告的同時將另乙個已存在的物件賦給它,就會呼叫複製建構函式;如果物件已經存在,然後將另乙個已存在的物件賦給它,呼叫的就是賦值運算子(過載)

問題2:

預設的複製建構函式和賦值運算子進行的都是淺拷貝,只是簡單地複製字段,因此如果物件中含有動態分配的記憶體,就需要我們自己重寫複製建構函式或者過載賦值運算子來實現深拷貝,確保資料的完整性和安全性。

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

結果:

其中比較奇怪的是,return_value1其中返回的是區域性變數,這時沒有呼叫拷貝建構函式,而return_value直接返回引數,這時呼叫了拷貝建構函式,這點比較奇怪,我還沒搞清楚,還有知道的同學明示。

本文參考:

c++:複製建構函式在什麼時候被呼叫

c++拷貝建構函式(深拷貝,淺拷貝)

C 建構函式 拷貝建構函式

建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...

C 中的拷貝建構函式

在c 中,下面三種物件需要呼叫拷貝建構函式 1 乙個物件以值傳遞的方式傳入函式體 2 乙個物件以值傳遞的方式從函式返回 3 乙個物件需要通過另外乙個物件進行初始化 注意 1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式。2.類中有指標型別的資料成員事就要呼叫自己...

理解C 中拷貝建構函式

拷貝建構函式的功能是用乙個已有的物件來初始化乙個被建立的同樣物件,是一種特殊的建構函式,具有一般建構函式的所有特性,當建立乙個新物件的時候系統會自動呼叫它 其形參是本類物件的引用,它的特殊功能是將引數代表的物件逐域拷貝到新建立的物件中。使用者可以根據實際需要定義特定的拷貝建構函式,以實現同類物件之間...