深拷貝與淺拷貝

深拷貝與淺拷貝函數

關於這兩個概念先來看一個例子:spa

         

在這個例子中,數據成員是一個int類型的數據m_iCount,它的拷貝構造函數的實現很簡單,3d

當使用右邊所示的方法實例化arr2時就會調用拷貝構造函數,也就是直接進行數值的拷貝便可。指針

將這個例子進行一下修改:對象

在這個例子當中,增長了一個int *類型的指針數據成員,在構造函數中使用new分配了一段內存,blog

而後使用指針指向這段內存空間;而拷貝構造函數仍是進行簡單的賦值拷貝操做,經過上面的方內存

法來實例化arr2這將會致使兩個對象中的指針指向同一段內存空間,也就是實例化arr1時分配的構造函數

內存空間,這將會形成很是危險的後果,例如兩個對象操做這段內存,兩個對象在銷燬的時候都方法

去釋放這段內存。im

咱們將上面的拷貝模式叫作淺拷貝,它只是進行了簡單的數值拷貝。

那麼咱們須要將Array類的拷貝構造函數進行一些修改,使之變成深拷貝,以下所示:

在深拷貝函數中,再也不是直接進行數值拷貝,而是再次申請一段新的內存,而後將內存中的數據拷貝過去。

總結:當進行對象拷貝時,不是簡單的作數值拷貝,而是將堆內存中的數據也進行拷貝,這種拷貝模式就

叫作深拷貝。

相關文章
相關標籤/搜索