深拷貝與淺拷貝函數
關於這兩個概念先來看一個例子:spa
在這個例子中,數據成員是一個int類型的數據m_iCount,它的拷貝構造函數的實現很簡單,3d
當使用右邊所示的方法實例化arr2時就會調用拷貝構造函數,也就是直接進行數值的拷貝便可。指針
將這個例子進行一下修改:對象
在這個例子當中,增長了一個int *類型的指針數據成員,在構造函數中使用new分配了一段內存,blog
而後使用指針指向這段內存空間;而拷貝構造函數仍是進行簡單的賦值拷貝操做,經過上面的方內存
法來實例化arr2這將會致使兩個對象中的指針指向同一段內存空間,也就是實例化arr1時分配的構造函數
內存空間,這將會形成很是危險的後果,例如兩個對象操做這段內存,兩個對象在銷燬的時候都方法
去釋放這段內存。im
咱們將上面的拷貝模式叫作淺拷貝,它只是進行了簡單的數值拷貝。
那麼咱們須要將Array類的拷貝構造函數進行一些修改,使之變成深拷貝,以下所示:
在深拷貝函數中,再也不是直接進行數值拷貝,而是再次申請一段新的內存,而後將內存中的數據拷貝過去。
總結:當進行對象拷貝時,不是簡單的作數值拷貝,而是將堆內存中的數據也進行拷貝,這種拷貝模式就
叫作深拷貝。