回覆列表
-
1 # 誰暖冬季只若稻葵
-
2 # 使用者8542928681829
複製有兩種:深複製,淺拷貝當出現類的等號賦值時,會呼叫複製函式在未定義顯示複製建構函式的情況下,系統會呼叫預設的複製函式--即淺複製,它能夠完成成員的一一複製。當資料成員中沒有指標時,淺複製是可行的。但當資料成員中有指標時,如果採用簡單的淺複製,則兩類中的兩個指標將指向同一個地址,當物件快結束時,會呼叫兩次解構函式,而導致指標懸掛現象。所以,這時,必須採用深複製。深複製與淺複製的區別就在於深複製會在堆記憶體中另外申請空間來儲存資料,從而也就解決了指標懸掛的問題。簡而言之,當資料成員中有指標時,必須要用深複製。
淺複製就是成員資料之間的一一賦值:把值賦給一一賦給要複製的值。但是可能會有這樣的情況:物件還包含資源,這裡的資源可以值堆資源,或者一個檔案。。當值複製的時候,兩個物件就有用共同的資源,同時對資源可以訪問,這樣就會出問題。深複製就是用來解決這樣的問題的,它把資源也賦值一次,使物件擁有不同的資源,但資源的內容是一樣的。對於堆資源來說,就是在開闢一片堆記憶體,把原來的內容複製。
如果你複製的物件中引用了某個外部的內容(比如分配在堆上的資料),那麼在複製這個物件的時候,讓新舊兩個物件指向同一個外部的內容,就是淺複製;如果在複製這個物件的時候為新物件製作了外部物件的獨立複製,就是深複製。
所以對於case1的話,你改變一下line1內部的東西,如果你發現line2內部相應的東西也改變了,那就是shallowcopy,如果不變的話,就是deepcopy。
對於case2的話,如果equalsmethod只是比對一下數值的話,它就是一個shallowreferencecomparision,deepcomparision的話,應該還比對一下數值的地址。