C 深拷貝 與 淺拷貝

2021-07-03 00:26:46 字數 1293 閱讀 9579

【摘要】

本文分三部分闡釋深拷貝於淺拷貝,著眼點主要還是在深拷貝。第一部分講述為什麼會有拷貝,即物件之間的複製。第二部分講述為什麼會有深拷貝於淺拷貝,即類成員存在資源分配。第三部分闡釋深拷貝於淺拷貝的定義與使用方式,即是否自定義拷貝函式。

【正文】

對於c++而言,在程式設計師進行類定義的時候,系統會自動生成四個函式,即,建構函式、析構函式、拷貝函式和賦值函式。這一點在 string 類的身上有很明顯體現。這篇文章將要講述的是拷貝函式中存在的乙個小的知識點,深拷貝於淺拷貝。

眾所周知,類物件是通過拷貝函式來實現類物件之間的拷貝的,那麼,第一步先來討論下,有哪些情況存在類物件之間的拷貝。

存在類物件拷貝的三種情況1. 用已有物件初始化新物件

例: myclass obj_a(obj_b);

2. 呼叫輸入引數為類物件的函式

例:myclass func_a(obj_a);

3. 呼叫返回值為類物件的函式

例:myclass b = func_b();

此時函式的返回值為類物件,為給新的物件 b 賦值,此時,系統會臨時複製出乙個物件。

如果只存在簡單複製,諸如,整數賦給整數我們肯定就不會討論這麼瑣碎的深拷貝於淺拷貝問題了。那麼,現在就來說說,為什麼會有深拷貝和淺拷貝的提出。

深拷貝的原因類物件間複製,因類成員存在資源(動態記憶體,堆)申請的情況,而產生因複製出現的混亂。

例·:原有物件 a 的成員存在動態記憶體申請,將物件 a 複製給物件 b ,b 獲得的是 a 開闢的記憶體空間位址,若類未自定義拷貝(複製)函式,系統自行處理使得該記憶體空間的隸屬權產生混亂。一旦析構,該空間將面臨兩次記憶體釋放的情況,出現執行錯誤。

為解決上述問題,c++有了深拷貝於淺拷貝的概念,那麼現在來談談什麼是深拷貝什麼是淺拷貝。

深拷貝於淺拷貝的定義

深拷貝可以理解為類擁有資源(堆,動態記憶體或其它系統資源),當類物件發生複製時,申請資源重建的情況稱之為深拷貝,申請資源未重建的情況稱之為淺拷貝。

最後來談談怎麼實現深拷貝於淺拷貝,淺拷貝其實直接使用系統自行定義的拷貝建構函式即可,現在主要說說深拷貝怎麼做。

深拷貝的實現方式:
自定義拷貝函式,對待「賦值」物件進行動態記憶體之類的操作機制,輸入引數一定是 引用。

例:myclass(myclass &srs);

C 深拷貝 與 淺拷貝

最近在寫一些c 程式,遇到個問題,記憶體會出錯,查了一些材料,終於發現問題所在了,原來碰到了傳說中的深拷貝和淺拷貝問題了,檢視一些材料,現在對這個問題做個總結 在類定義中,預設是淺拷貝,即 位拷貝 用在基本類中或者一些沒有指標的自定義型別中沒有一點問題,但是當遇到含有指標變數的自定義型別的時候,就會...

C 淺拷貝與深拷貝

淺拷貝 shallow copy 指的是當物件的字段被拷貝的時候,字段應用的物件不會被拷貝。深拷貝是對物件例項當中的字段引用的物件也進行拷貝的一種方式。淺拷貝可以通過將類實現介面icloneable class myclass icloneable 舉個簡單的例項 using system usin...

c 深拷貝與淺拷貝

對於普通型別的物件來說,它們之間的複製是很簡單的,例如 int a 88 int b a 而類物件與普通物件不同,類物件內部結構一般較為複雜,存在各種成員變數。下面看乙個類物件拷貝的簡單例子。iostream using namespace std class cexample void show ...