關於C 的深拷貝與淺拷貝

2021-07-24 03:28:51 字數 934 閱讀 9642

最近因為我個人正在找工作的原因,被面試到深拷貝與淺拷貝的問題。這個我只是以前聽說過相關的概念,並沒有深究。所以被問到的時候答得不是很好。回來查閱資料與各位大牛的部落格,寫點自己的總結:

當用乙個已初始化過了的自定義類型別物件去初始化另乙個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:

(1)乙個物件以值傳遞的方式傳入函式體,

(2)乙個物件以值傳遞的方式從函式返回 ,

(3)乙個物件需要通過另外乙個物件進行初始化。

如果在類中沒有顯式地宣告乙個拷貝建構函式,那麼,編譯器將會自動生成乙個預設的拷貝建構函式,那麼這個拷貝建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝。

既然引入了淺拷貝的概念,那麼接下來就說一下關於深拷貝與淺拷貝的一點區別。

假設現在定義了乙個類a,有a a時;如果我要用到類似下面的語句:

a b(a);

a b=a

;

以上兩個語句,必然會呼叫拷貝建構函式。那麼,由於我這個類a並沒有定義什麼拷貝建構函式,所以此時編譯器會產生乙個預設的拷貝建構函式。在這種情況下,進行的拷貝操作叫淺拷貝。當然如果這個類中含有指標變數,這種情況下拷貝,是會出錯的。

在有指標的情況下,淺拷貝只是增加了乙個指標指向已經存在的記憶體,而深拷貝就是增加乙個指標並且申請乙個新的記憶體,使這個增加的指標指向這個新的記憶體,採用深拷貝的情況下,釋放記憶體的時候就不會出現在淺拷貝時重複釋放同一記憶體的錯誤!

用一句簡單的話來說就是淺拷貝,只是對指標的拷貝,拷貝後兩個指標指向同乙個記憶體空間,深拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同位址的指標。

深拷貝和淺拷貝可以簡單理解為:如果乙個類擁有資源,當這個類的物件發生複製過程的時候,資源重新分配,這個過程就是深拷貝,反之,沒有重新分配資源,就是淺拷貝。

關於深拷貝與淺拷貝

相關理解 注意 閉包中的變數存在在堆記憶體中而非棧記憶體中。賦值與淺拷貝 array.prototype.slice實現對陣列的淺拷貝 array.prototype.concat將陣列和陣列或和值連線在一起成新的陣列 擴充套件運算子 實現淺拷貝 原理 新的物件複製已有物件中非物件屬性的值和物件屬性...

C 深拷貝 與 淺拷貝

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

C 淺拷貝與深拷貝

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