C++深拷貝與淺拷貝
拷貝有兩種:深拷貝,淺拷貝。
當出現類的等號賦值時,會調用拷貝函數,在未定義顯示拷貝建構函式的情況下,系統會調用預設的拷貝函數——即淺拷貝,它能夠完成成員的一一複製。當資料成員中沒有指標時,淺拷貝是可行的。但當資料成員中有指標時,如果採用簡單的淺拷貝,則兩類中的兩個指標將指向同一個地址,當對象快結束時,會調用兩次解構函式,而導致指標懸掛現象。所以,這時,必須採用深拷貝。
深拷貝與淺拷貝的區別就在於深拷貝會在堆記憶體中另外申請空間來儲存資料,從而也就解決了指標懸掛的問題。簡而言之,當資料成員中有指標時,必須要用深拷貝。
----------------------------------
補充.NET相關知識:
引用對象的淺拷貝原理:
引用對象之間的賦值之所以執行的是淺拷貝動作,與引用對象的特性有關,一個引用對象一般來說由兩個部分組成
(1)一個具名的Handle,也就是我們所說的聲明(如變數);
(2)一個內部(不具名)的對象,也就是具名Handle的內部對象。它在Manged Heap(託管堆)中分配,一般由新增引用對象的New方法是進行建立;
如果這個內部對象已被建立,那麼具名的Handle就指向這個內部對象在Manged Heap中的地址,否則就是null(從某個方面來講,如果這個具名的handle可以被賦值為null,說明這是一個引用對象,當然不是絕對)。兩個引用對象如果進行賦值,它們僅僅是複製這個內部對象的地址,內部對象仍然是同一個,因此,來源物件或拷貝對象的修改都會影響對方。這也就是淺拷貝。
MemberwiseClone是一個Protected方法,很多Class(如Array)的Clone方法其實上調用的MemberwiseClone方法,執行的是淺拷貝,該方法定義在object class上。
附題目:
1、SqlConnection con = new SqlConnection(); SqlConnection c = con; c = null;
為什麼執行上面語句後con對象沒有為null呢?
答案:con是一個引用對象,因此有兩個部分handle和對象,將設con所持有的handle叫 HandleA.接下來當聲明了sqlconnection c時,c具有另外的一個handle,假設叫HandleB.將con賦給c後,只是HandleB也指向HandleA所指向的對象.即內部對象一樣,但是指向對象的Handle不一樣了.當執行c=null時,僅僅是將HandleB指向了null.原先指向的對象仍然不變,所以con對象不為null
2、經典java面試題
①String str=new String("abc");
這行代碼究竟建立了幾個String對象呢?相信大家對這道題並不陌生,答案也是眾所周知的,2個。
②String a="abc"; String b="abc";
那這裡呢?答案是一個。
③String a="ab"+"cd";
答案是三個。
解答地址:http://www.iteye.com/topic/209904