當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:
(1)乙個物件以值傳遞的方式傳入函式體
(2)乙個物件以值傳遞的方式從函式返回
(3)乙個物件需要通過另外乙個物件進行初始化。
如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝,後面將進行說明。
自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。
淺拷貝和深拷貝
在某些狀況下,類內成員變數需要動態開闢堆記憶體,如果實行位拷貝,也就是把物件裡的值完全複製給另乙個物件,如a=b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那a中的那個成員變數也指向同一塊記憶體。這就出現了問題:當b把記憶體釋放了(如:析構),這時a內的指標就是野指標了,出現執行錯誤。
深拷貝和淺拷貝可以簡單理解為:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。下面舉個深拷貝的例子。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include
using
namespace
std;
class
ca
ca(
const
ca& c)
void
show()
~ca()
private
:
int
a;
char
*str;
};
int
main()
來總結一下關於 深拷貝與淺拷貝需要知道的基本概念和知識:
(1)什麼時候用到拷貝函式?
a.乙個物件以值傳遞的方式傳入函式體;
b.乙個物件以值傳遞的方式從函式返回; c.
乙個物件需要通過另外乙個物件進行初始化。
如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝
(2)是否應該自定義拷貝函式?
(3)什麼叫深拷貝?什麼是淺拷貝?兩者異同?
自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。
深如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。
(4)深拷貝好還是淺拷貝好?
如果實行位拷貝,也就是把物件裡的值完全複製給另乙個物件,如a=b。這時,如果b中有乙個成員變數指標已經申請了記憶體,那a中的那個成員變數也指向同一塊記憶體。這就出現了問題:當b把記憶體釋放了(如:析構),這時a內的指標就是野指標了,出現執行錯誤
C 深拷貝與淺拷貝 詳解
include using namespace std class test test test int p,int n test test void test show int main void test a b,88 a.show 上面的拷貝建構函式不夠正規,現在寫乙個常用的拷貝建構函式 in...
js淺拷貝與深拷貝詳解
淺拷貝與深拷貝 如果b複製了a,改變a,b也跟著變了這就是淺拷貝,如果b沒有變就是深拷貝。舉個例子 這裡就要引入基本資料型別和引用資料型別的概念了,基本資料型別有 number string boolean null undefined symbol。引用資料型別 object array 以及函式...
C 深拷貝 與 淺拷貝
最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...