深拷貝 淺拷貝

2022-03-09 03:15:03 字數 1373 閱讀 2794

什麼是淺拷貝(shallow copy)和深拷貝(deep copy)?淺拷貝就是成員資料之間的一一賦值:把值一一賦給要拷貝的值。但是可能會有這樣的情況:物件還包含資源,這裡的資源可以是堆資源,或者乙個檔案。。當值拷貝的時候,兩個物件就有用共同的資源,同時對資源可以訪問,這樣就會出問題。深拷貝就是用來解決這樣的問題的,它把資源也賦值一次,使物件擁有不同的資源,但資源的內容是一樣的。對於堆資源來說,就是在開闢一片堆記憶體,把原來的內容拷貝。 

如果你拷貝的物件中引用了某個外部的內容(比如分配在堆上的資料),那麼在拷貝這個物件的時候,讓新舊兩個物件指向同乙個外部的內容,就是淺拷貝;如果在拷貝這個物件的時候為新物件製作了外部物件的獨立拷貝,就是深拷貝 。

引用和指標的語義是相似的,引用是不可改變的指標,指標是可以改變的引用。其實都是實現了引用語義。

深拷貝和淺拷貝的區別是在物件狀態中包含其它物件的引用的時候,當拷貝乙個物件時,如果需要拷貝這個物件引用的物件,則是深拷貝,否則是淺拷貝。

cow語義是「深拷貝」與「推遲計算」的組合,仍然是深拷貝,而非淺拷貝,因為拷貝之後的兩個物件的資料在邏輯上是不相關的,只是內容相同。

什麼情況下使用淺拷貝什麼時候使用深拷貝?無論深淺,都是需要的。當深拷貝發生時,通常表明存在著乙個「聚合關係」,而淺拷貝發生時,通常表明存在著乙個「相識關係」。

舉個簡單的例子:

當你實現乙個composite pattern,你通常都會實現乙個深拷貝(如果需要拷貝的話),很少有要求同的composite共享leaf的;

而當你實現乙個observer pattern時,如果你需要拷貝observer,你大概不會去拷貝subject,這時就要實現個淺拷貝。

是深拷貝還是淺拷貝,並不是取決於時間效率、空間效率或是語言等等,而是取決於哪乙個是邏輯上正確的。

在c++中default constructor對物件進行的是怎樣的拷貝動作?再糾正乙個概念:

default constructor是不負責拷貝動作的,我想你說的應該是指implicitly-declared copy constructor。它會呼叫所有直系基類的copy constructor和有成員的copy constructor,並且複製vtpr。如果乙個類:

1:沒有虛方法和虛基類

2:所有直系基類的copy constructor都是無代價的

3:所有成員的copy constructor都是無代價的

這時它的copy constructor是無代價的,相當於用memcpy實現。

判斷它是深拷貝還是淺拷貝,還是要根據類的實現。比如如果它有乙個用原生指標指標實現的物件引用,或是用boost::shared_ptr等引用分享所有權的智慧型指標實現的物件引用,則這個拷貝是淺拷貝;如果是用copy_ptr這種實現了深拷貝的智慧型指標實現的物件引用,就是深拷貝了。

淺拷貝 深拷貝

copy mutablecopy copy 不管是可變的,還是不可變的,結果都是不可變的 mutablecopy 不管是不可變的,還是可變的,結果都是可變的 nsmutablestring str nsmutablestring stringwithformat a nsarray arr1 str...

深拷貝 淺拷貝

c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...

淺拷貝 深拷貝

retain是建立乙個指標,引用物件計數加1。copy屬性表示兩個物件內容相同,新的物件retain為1 與舊有物件的引用計數無關,舊有物件沒有變化。copy減少物件對上下文的依賴。retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,re...