一、拷貝建構函式:
格式: a(const a& a);
總結:系統為物件b分配了記憶體並完成了與物件testa的複製過程,就類物件而言,相同型別的類物件是通過拷貝建構函式來完成整個複製過程的。
1.拷貝建構函式的使用:
a testa;
a b = testa;
2.析構的先後順序:
程式結束,析構的時候,先析構了b,後析構了testa.
二、拷貝建構函式的呼叫時機
1、當函式的引數為類的物件時;
呼叫copy_constructor_fun(a aa)時,會產生以下幾個重要步驟:
(1)、a物件傳入形參時,會先產生乙個臨時變數temp;
(2)、然後呼叫拷貝建構函式把a的值給temp。
(3)、等copy_constructor_fun()指向完畢後,析構掉temp。
2、函式的返回值是類的物件
3、物件需要另外乙個物件進行初始化
a testa(100);
a b = testa;
或者:a c(testa);
三、深拷貝和淺拷貝
1、預設拷貝建構函式
2、淺拷貝
簡單的值複製,比如上面幾個例子,都是淺拷貝,預設的拷貝建構函式都是淺拷貝。
3、深拷貝
深拷貝主要用於類中有指標成員變數時,防止析構的時候指標懸掛現象。
因為預設的拷貝建構函式只是簡單的值複製,如果存在指標變數,相當於兩個指標指向同一塊記憶體位址,析構的時候,該塊記憶體位址會被析構兩遍,那麼當第一次被釋放之後,後面指向該記憶體的指標就會存在懸掛的現象。
深拷貝主要是為拷貝的類物件中的指標變數開闢新的記憶體空間,這樣釋放的時候,就不會出現懸掛現象。
寫明顯示的深拷貝建構函式:
四、總結
1.為什麼拷貝建構函式的引數必須是引用傳遞,而不是值傳遞
防止遞迴呼叫。
2、拷貝建構函式的作用
用來複製物件的,使用以乙個物件的例項來初始化這個物件的乙個新的例項。
3、對乙個類a,如果乙個建構函式的第乙個引數是下列之一:
1) a&
2) const a&
3) volatile a&
4) const volatile a&
且沒有其他引數或者其他引數都有預設值,那麼這個函式是拷貝建構函式。
4、乙個類中可以存在多餘乙個的拷貝建構函式嗎?
答: 類中可以存在超過乙個拷貝建構函式。
注意,如果乙個類中只存在乙個引數為 x& 的拷貝建構函式,那麼就不能使用const x或volatile x的物件實行拷貝初始化.
如果乙個類中沒有定義拷貝建構函式,那麼編譯器會自動產生乙個預設的拷貝建構函式。
這個預設的引數可能為 x::x(const x&)或 x::x(x&),由編譯器根據上下文決定選擇哪乙個。
5、建構函式可以過載,析構函式不可以過載。
6、禁止拷貝,禁止賦值操作符
將拷貝建構函式和賦值操作符宣告為private即可。
C 中拷貝建構函式
拷貝建構函式主要需要考慮兩個問題 乙個是什麼時候會呼叫拷貝建構函式,另乙個是拷貝建構函式中的淺拷貝和深拷貝 問題1 1 物件在建立時使用其他的物件初始化 cstudent b a 此時複製建構函式被用來建立例項b cstudent c a 此時複製建構函式被用來在定義例項p時初始化c 2 物件作為函...
C 中的拷貝建構函式
在c 中,下面三種物件需要呼叫拷貝建構函式 1 乙個物件以值傳遞的方式傳入函式體 2 乙個物件以值傳遞的方式從函式返回 3 乙個物件需要通過另外乙個物件進行初始化 注意 1.如果不主動編寫拷貝建構函式和賦值函式,編譯器將以 位拷貝 的方式自動生成預設的函式。2.類中有指標型別的資料成員事就要呼叫自己...
C 中的拷貝建構函式
今天在學習c 時看到了這樣一句話 就好奇為什麼我們需要自己定義拷貝建構函式,以及 當我們自己定義拷貝建構函式後,成員變數的逐個拷貝 功能失效如何理解?1 如果類只包含類型別成員和內建型別的成員,則可以不用顯示定義複製建構函式。但如果類中包含有指標或者有分配其他型別資源時就必須重新定義複製建構函式。因...