拷貝建構函式的目的就是完成對乙個物件的拷貝,一般在一下三種場景下會呼叫該物件的拷貝建構函式:
1.函式返回型別是類的物件時
2.函式的引數是類的物件,呼叫該函式時會呼叫該類的拷貝建構函式
3.使用乙個物件去初始化類的另乙個物件時 f a = new f(1,2); f b = a; / f b(a) 注意必須要在類的初始化中使用,不是類的賦值
拷貝建構函式的關鍵意義在與可以實現深拷貝,即實現申請新的記憶體空間並複製其值。預設拷貝建構函式實現的是淺拷貝,即完成物件的一一複製但該物件還是指向堆中同乙個物件。
為什麼要實現自定義的拷貝建構函式?
當建構函式中實現了指標型別,則當多次呼叫預設的拷貝建構函式後,實際上多個物件都是指向堆中同乙個記憶體,那麼當呼叫析構函式時只有一次真正實現了記憶體釋放,出現了指標懸掛現象。
為什麼自定義拷貝建構函式必須是引用傳遞(&)而不能是值傳遞?
因為防止無限遞迴,因為如果是值傳遞則會再一次呼叫拷貝建構函式……所以自定義拷貝建構函式必須滿足一下要求:
解答:對於乙個類x, 如果乙個建構函式的第乙個引數是下列之一:
a) x&
b) const x&
c) volatile x&
d) const volatile x&
且沒有其他引數或其他引數都有預設值,那麼這個函式是拷貝建構函式.
順便提一下c#的拷貝建構函式:
實現方式類似,但是更加簡單,這裡的previousperson居然不是引用型別,由此可以看出c#的類物件,在作為函式引數時不會呼叫拷貝建構函式的……
c 拷貝建構函式記錄
class x x obj1 x obj2 obj1 情況1 呼叫拷貝建構函式 x obj3 obj1 情況2 呼叫拷貝建構函式 f x o 情況3 一堆想做函式引數時,呼叫拷貝建構函式 x f x arr 4 情況5 a 0 a 1 呼叫拷貝的建構函式,a 2 a 3 呼叫預設建構函式 也不需要再...
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 基礎3 拷貝 複製 建構函式
使用類建立物件時,建構函式被自動呼叫以完成物件的初始化,那麼能否象簡單變數的初始化一樣,直接用乙個物件來初始化另乙個物件呢?答案是可以 student s1 student s2 s1 像這種語句在語法上是合法的。初始化s2,相當於將s1中每個資料成員的值複製到s2中,這是表面現象。實際上,系統呼叫...