C 中淺拷貝 深拷貝 物件的複製 物件的賦值

2021-07-16 02:46:44 字數 1420 閱讀 3695

一、概念字面理解

1、淺拷貝:發生物件複製時,只是對對像張資料成員進行簡單的賦值。涉及到動態分配問題,如果按淺拷貝進行複製,不做特殊處理,複製完成後,兩個物件中涉及動態分配空間的變數,不管他們各自的空間,及空間中的內容都是完全一樣的,當對這兩個物件進行析構時,會發生同一片空間被釋放兩次,因而會出現錯誤。

如指標,淺拷貝只是對指標進行複製,複製完成後,兩個指標指向同乙個記憶體空間,而深拷貝不止對指標進行複製,也對指標指向的內容進行複製,深拷貝後,兩個指標指向不同位址的記憶體空間,但內容相同。

淺拷貝可能存在的問題(均是指存在動態分配或者指標變數的情況下):

(1)析構時,同乙個記憶體空間可能會被釋放兩次,這是錯誤的;

(2)經淺拷貝後,指向同乙個記憶體空間,任何一方變動都會影響到另一方;

(3)假如類存在char *ch,class_name obj1(obj),因為obj.ch和obj1.ch指向同乙個記憶體空間,當delete obj.ch,delete.obj.ch記憶體被釋放後,obj1.ch所指的空間不能在被利用了,delete.obj1.ch也不會成功,也會導致一直無法操作該空間,因而會導致記憶體洩漏。結論:在釋放時,會因為obj1.ch的記憶體沒有被釋放,造成記憶體洩漏。

eg:class

rect  

~rect() // 析構函式,釋放動態分配的空間

}  private

:  int

width;  

intheight;  

int*p; 

// 一指標成員

};  

intmain()  

說明:類rect中有動態分配存在;

rect1複製給rect2,在line23會隱式呼叫預設拷貝建構函式,淺拷貝,只是物件資料成員的賦值操作,此時,rect1.p和rect2.p不僅值相同,而且指向同一片空間,因此在程式執行完成前,及在進行析構時會發生錯誤:同一片位址空間被釋放兩次;

改進方法是採用深拷貝:

eg:class

rect  

rect(const

rect& r)  

~rect() // 析構函式,釋放動態分配的空間

}  private

:  int

width;  

intheight;  

int*p; 

// 一指標成員

};2、深拷貝

3、物件複製

4、物件的賦值

5、預設拷貝建構函式、自定義拷貝建構函式

其他:(1)宣告乙個私有的拷貝建構函式,可以防止預設拷貝發生。如果試圖呼叫 

a b(a); 

就呼叫了私有的拷貝建構函式,編譯器會報錯。

(2)乙個類中可以存在多個拷貝建構函式。(const拷貝和非const拷貝

eg:calss a  

複製物件 和 淺拷貝,深拷貝

複製物件顧名思義,複製乙個物件作為副本,它會開闢一塊新的記憶體 堆記憶體 來儲存副本物件,就像複製檔案一樣.既源物件和副本物件是兩塊不同的記憶體區域.物件具備複製功能,必須實現 協議協議 常用的可複製物件有,nsnumber,nsstring,nsarray,nsdictionary,nsmutab...

JS物件複製 深拷貝 淺拷貝

在本文中,我們將從淺拷貝 shallow copy 和深拷貝 deep copy 兩個方面,介紹多種 js 中複製物件的方法。var foo console.log foo.a abc var bar foo console.log bar.a abc foo.a yo foo console.lo...

C 類物件的複製 拷貝建構函式 深拷貝,淺拷貝

c 類物件的複製 拷貝建構函式 深拷貝,淺拷貝 進一步理解類成員的操作!站點 www.ev lab.com include using namespacestd classtest protected intp1 void main 普通物件和類物件同為物件,他們之間的特性有相似之處也有不同之處,類...