天天看點

深複制和淺複制(深拷貝和淺拷貝)

關于深淺拷貝網上到處都是解釋,大都解釋的不錯,這裡再次總結,原因有二:

1.溫故而知新;2.把所學習到的知識總結歸納。

進入正題,深淺複制都是由于使用複制構造函數來初始化新建立的對象。

先談談概念:

淺複制(淺拷貝):被複制對象的所有成員的值都和原來的對象的成員值保持一緻。

比如:

上面的代碼無疑會造成淺複制,因為預設的複制構造函數逐個複制非靜态成員,複制的是成員的值。在程式清單中:

   String str2 = str1;

與下面的代碼等效:

   String str2;

   str2.len = str1.len;

   str2.str = str1.str;

這樣導緻的問題顯而易見,那就是str1和str2的成員變量str的内容相同,即他們指向同一塊記憶體,這是一個很嚴重的問題,當其中任意的一個銷毀,也就是意味着str指向的記憶體釋放,而str1和str2終将會走向生命的盡頭,也就意味着同一塊記憶體被銷毀兩次,這就會帶來意想不到的後果。這通常是記憶體管理不善的表現。

   那如何可以解決上述淺複制的問題呢?這裡我們就得談談深複制了。

深複制(深拷貝):被複制對象會把自己所有的非引用字段複制給新的對象相印的字段,同時也将在新的對象中開辟新的空間來存放被複制對象的引用字段指向的内容。

這樣就得在類中顯示的定義複制構造函數,如下:

   總而言之,深拷貝就是在拷貝的同時自己開辟了空間來存儲被複制對象中指針所指向的内容。這樣也就解決了淺拷貝考慮不周全帶來的問題。