C++深拷貝與淺拷貝

來源:互聯網
上載者:User

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

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.