深拷貝和淺拷貝

2021-09-29 05:07:43 字數 957 閱讀 4633

2. 深拷貝

淺拷貝是按位拷貝物件,它會建立乙個新物件,這個物件有著原始物件屬性值的乙份精確拷貝。如果屬性是基本型別,拷貝的就是基本型別的值;如果屬性是記憶體位址(引用型別),拷貝的就是記憶體位址 ,因此如果其中乙個物件改變了這個位址,就會影響到另乙個物件。即預設拷貝建構函式只是對物件進行淺拷貝複製(逐個成員依次拷貝),即只複製物件空間而不複製資源。

實現淺拷貝的類,需要實現cloneable介面,並覆寫clone()方法。

(1) 對於基本資料型別的成員物件,因為基礎資料型別是值傳遞的,所以是直接將屬性值賦值給新的物件。基礎型別的拷貝,其中乙個物件修改該值,不會影響另外乙個。

(2) 對於引用型別,比如陣列或者類物件,因為引用型別是引用傳遞,所以淺拷貝中的引用型別只是把記憶體位址賦值給了另乙個變數,它們其實都指向同一記憶體空間,改變其中乙個,會對另外乙個也產生影響。這種情況是不安全的。

淺拷貝會帶來資料安全方面的隱患,例如我們只是想修改了 studentb 的 subject,但是 studenta 的 subject 也被修改了,因為它們都是指向的同乙個位址。所以,此種情況下,我們需要用到深拷貝。

每個物件都需要實現 cloneable 介面並重寫 clone() 方法,即物件內部的物件都需要實現cloneable介面 並重寫 clone() 方法

(1) 對於基本資料型別的成員物件,因為基礎資料型別是值傳遞的,所以是直接將屬性值賦值給新的物件。基礎型別的拷貝,其中乙個物件修改該值,不會影響另外乙個(和淺拷貝一樣)。

(2) 對於引用型別,比如陣列或者類物件,深拷貝會新建乙個物件空間,然後拷貝裡面的內容,所以它們指向了不同的記憶體空間。改變其中乙個,不會對另外乙個也產生影響。

(3) 對於有多層物件的,每個物件都需要實現 cloneable 並重寫 clone() 方法,進而實現了物件的序列層層拷貝。

(4) 深拷貝相比於淺拷貝速度較慢並且花銷較大。

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...

深拷貝和淺拷貝

ios提供了copy和mutablecopy方法,顧名思義,copy就是複製了乙個imutable的物件,而mutablecopy就是複製了乙個mutable的物件。以下將舉幾個例子來說明。1 系統的非容器類物件 這裡指的是nsstring nsnumber等等一類的物件。nsstring stri...