C 深拷貝與淺拷貝的區別與實現

2021-10-10 00:27:02 字數 675 閱讀 6946

在物件拷貝過程中,如果沒有自定義拷貝建構函式,系統會提供乙個預設的拷貝建構函式,預設的拷貝建構函式對於基本型別的成員變數,按位元組複製,對於類型別成員變數,呼叫其相應型別的拷貝建構函式。

背景:如果不主動編寫拷貝建構函式與賦值函式,編譯器將以「位拷貝」的方式自動生成預設的函式,如果類中含有指標引數,就會隱藏錯誤:以類string的兩個物件來說,假設a.data的內容為 a , b.data的內容為 b 。

1.兩個指標物件會指向同一區域的記憶體,會彼此影響。

2.將a.data賦值給b.data的時候,b.data原來的記憶體未被釋放,造成記憶體洩漏。

3.物件在析構釋放記憶體時,data會被釋放兩次。

!!!常將 拷貝構造物件語句寫為:

string a(b);          //方便區分賦值語句
建構函式與拷貝建構函式的具體實現:

//建構函式

array::array(int count)

cout<<"array"<}//拷貝建構函式

array::array(const array& arr)

cout<<"array &"<}//析構函式

array::~array()

C 淺拷貝與深拷貝區別

也許會有人這樣解釋c 中淺拷貝與深拷貝區別 淺拷貝是對引用型別拷貝位址,對值型別直接進行拷貝。不能說它完全錯誤,但至少還不夠嚴謹。比如 string 型別咋說?其實,我們可以通過實踐來尋找答案。首先,定義以下型別 int string enum struct class int string 如下 ...

C 淺拷貝與深拷貝區別

也許會有人這樣解釋c 中淺拷貝與深拷貝區別 淺拷貝是對引用型別拷貝位址,對值型別直接進行拷貝。不能說它完全錯誤,但至少還不夠嚴謹。比如 string 型別咋說?其實,我們可以通過實踐來尋找答案。首先,定義以下型別 int string enum struct class int string 如下 ...

c 深拷貝與淺拷貝區別

深拷貝和淺拷貝最根本的區別在於是否真正獲取乙個物件的複製實體,而不是引用。假設b複製了a,修改a的時候,看b是否發生變化 如果b跟著也變了,說明是淺拷貝,拿人手短!修改堆記憶體中的同乙個值 如果b沒有改變,說明是深拷貝,自食其力!修改堆記憶體中的不同的值 淺拷貝 shallowcopy 只是增加了乙...