資料型別分為基本資料型別和引用資料型別,深拷貝和淺拷貝的概念也是針對引用資料型別的
引用資料型別在棧中儲存了指標(位址),該指標指向了堆中資料的(起始)位址,當直譯器尋找值時,會首先從棧中通過指標獲取位址,根據位址在堆中找到資料實體
而淺拷貝顧名思義,當我們對乙個引用資料型別進行拷貝使用的時候,拷貝的其實很淺,只是拷貝到了該物件的指標,並沒有對深層次的資料進行拷貝。
眾所周知 object !=== obeject ,但當淺拷貝情況出現, 就會出現object === obeject 因為拷貝的副本物件的值其實是乙個位址、乙個指標,他指向了堆中的資料,並且當我們修改副本或者原物件,會出現一改全改的情況,原物件和副本的值都會發生變化
弄清了淺拷貝,深拷貝就更好理解了,當我們實現深拷貝的時候,副本物件和原物件就不會出現 object===object的情況,雖然他們的值看起來一樣,但其實已經是完全不相關的兩個物件,副本物件不再引用原物件位址(指標),而是在棧中產生了乙個新的指標,指向了新的堆。
總結:
淺拷貝是複製了堆中資料存在的位址,深拷貝是在堆中重新開闢了一塊記憶體
參考資料:
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...
淺拷貝與深拷貝
淺拷貝 1 2 myclass a,b a b 為了封裝性和解耦,同型別的兩個物件之間進行賦值操作時,所有成員變數被複製,包括私有成員 指標變數。類的成員函式在傳遞或返回物件時都會進行物件複製產生臨時物件,比如函式呼叫時實參變為形參,以及函式返回物件。考慮到效能和使用者要求不同,編譯器不複製物件內部...
「淺拷貝」與「深拷貝」
c 中物件的複製就如同 轉殖 用乙個已有的物件快速地複製出多個完全相同的物件。一般而言,以下三種情況都會使用到物件的複製 1 建立乙個新物件,並用另乙個同類的已有物件對新物件進行初始化,例如 cpp view plain copy class rect rect rect1 rect rect2 r...