深拷貝與淺拷貝到底是什么
復(fù)制構(gòu)造函數(shù)也叫拷貝構(gòu)造函數(shù);

淺復(fù)制也叫淺拷貝或位拷貝;
深復(fù)制也叫深拷貝;
淺拷貝和深拷貝
拷貝就是復(fù)制,創(chuàng)建副本。假設(shè)有對象A,A有屬性t1,t2。那么,我通過拷貝A,得到B,B應(yīng)該也有屬性t1,t2,且A、B兩個對象的每個屬性,都應(yīng)該是相同的。
對于基本類型的屬性t1,拷貝是沒有疑義的。簡單將值復(fù)制一份,就達到了拷貝的效果。而對于引用類型的屬性t2來說,拷貝就有了兩層含義。
第一層是,我只是將t2引用的地址復(fù)制一份給B的t2,確實達到了屬性相同的效果,可以理解為實現(xiàn)了拷貝,但是事實上,兩個對象中的屬性t2對應(yīng)的是同一個對象。在B對象上對t2所指向的對象進行操作,就會影響到A對象中的t2的值。
第二層是,我將A的t2所指向的對象,假設(shè)為o1,完整復(fù)制一份,假設(shè)為o2,將新的o2的地址給B的t2。也達到了復(fù)制的效果,且對B的t2所指向的o2進行操作,不會影響到A的t2所指向的o1。
拷貝的兩層含義,對應(yīng)了淺拷貝和深拷貝的概念,做了第一層,就是淺拷貝,做到第二層,就是深拷貝。
基于以上內(nèi)容,很容易可以想到,淺拷貝比深拷貝要更快,但是,從拷貝的意義上來看,淺拷貝相較于深拷貝,要欠缺一點。
實例如下:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
根據(jù)上面實例可以看到,淺復(fù)制僅復(fù)制對象本身(其中包括是指針的成員),這樣不同被復(fù)制對象的成員中的對應(yīng)非空指針會指向同一對象,被成員指針引用的對象成為共享的,無法直接通過指針成員安全地刪除(因為若直接刪除,另外對象中的指針就會無效,形成所謂的野指針,而訪問無效指針是危險的;除非這些指針有引用計數(shù)或者其它手段確保被指對象的所有權(quán));而深復(fù)制在淺復(fù)制的基礎(chǔ)上,連同指針指向的對象也一起復(fù)制,代價比較高,但是相對容易管理。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。