1.淺拷貝:直接把原來物件的引用直接賦值給新的物件,因此,新物件的值只是引用了舊的物件的數值。
2.深拷貝: 賦值的時候不是簡單的引用舊的物件,而是重新建立乙個新的物件,再把舊的物件的各項數值全部拷貝賦值過來。所以新的物件是「值」而不是「引用」
我們希望在改變新的物件的時候,不改變原來的物件。
如設計帶指標的class的時候,我們必須要過載=,來定義乙個拷貝賦值的函式,而拷貝賦值背後的依賴就是深拷貝。如果沒有定義拷貝賦值函式當使用者使用 s1=s2的時候,就會出現s1中的物件只是引用了s2物件的數值,當我們修改了s1的數值的時候,s2的數值也會發生變化,這樣就很容易發生一些不必要的錯誤。class string的拷貝賦值的經典寫法如下:
inline string&
string::
operator
= (const string& str)
delete
m_data;
m_data =
newchar
[strlen
(m_data)+1
);strcpy
(m_data, str.m_data)
; returh *
this
;}
(1)先判斷是否自己給自己賦值。
(2)由於要建立的新的值,必須把自身的值給清理乾淨,否則會出現野指標的情況。
(3)返回型別是string&,因為使用者可能會有連續賦值的操作,如s1=s2=s3,返回型別是void的話,執行完s2=s3之後,得到的s2是void型的,再執行s1=s2的話就會發生錯誤,因為拷貝賦值右邊的引數是string型。
淺拷貝與深拷貝的區別
簡單的來說就是,在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!我列舉乙個例子來說吧 你正在編寫c 程式中有時用到,操...
淺拷貝與深拷貝的區別
簡單的來說就是,在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!我列舉乙個例子來說吧 你正在編寫c 程式中有時用到,操...
淺拷貝與深拷貝的區別
在python中有乙個copy模組。copy.copy 是淺拷貝 copy.deepcopy 是深拷貝 對於不可變型別,無論是淺拷貝還是深拷貝都只是指向作用,沒有進行拷貝,對於可變型別copy.copy 與copy.deepcopy存在差距 import copy a 1,2,3 b 4,5 c a...