1. 程式人生 > >C++深拷貝&淺拷貝

C++深拷貝&淺拷貝

先上結論:

深拷貝:拷貝的是指標所指向的一整塊記憶體,即將指標pSrc所指向的一整塊記憶體,拷貝出來,然後賦值給指標pDst所指向的一個區域,核心程式碼是

char* pDst = new char[128];
memcpy(pDst, pSrc, sizeof(pSrc));

淺拷貝:拷貝的是指標的值,即將指標pSrc賦值給了pDst

char* pDst = nullptr;
pDst = pSrc;

總結:淺拷貝只是對指標的拷貝,拷貝後兩個指標指向同一個記憶體空間;拷貝不但對指標進行拷貝,而且對指標指向的內容進行拷貝,經深拷貝後的指標是指向兩個不同地址的指標。

再說幾句:

當物件中存在指標成員時,除了在複製物件時需要考慮自定義拷貝建構函式,還應該考慮以下兩種情形:

1.當函式的引數為物件時,實參傳遞給形參的實際上是實參的一個拷貝物件,系統自動通過拷貝建構函式實現;

2.當函式的返回值為一個物件時,該物件實際上是函式內物件的一個拷貝,用於返回函式呼叫處。

應用場景:

當用一個已初始化過了的自定義類型別物件去初始化另一個新構造的物件的時候,拷貝建構函式就會被自動呼叫。也就是說,當類的物件需要拷貝時,拷貝建構函式將會被呼叫。以下情況都會呼叫拷貝建構函式:
一個物件以值傳遞的方式傳入函式體 
一個物件以值傳遞的方式從函式返回 
一個物件需要通過另外一個物件進行初始化。

如果在類中沒有顯式地宣告一個拷貝建構函式,那麼,編譯器將會自動生成一個預設的拷貝建構函式,該建構函式完成物件之間的位拷貝。位拷貝又稱淺拷貝,後面將進行說明。

自定義拷貝建構函式是一種良好的程式設計風格,它可以阻止編譯器形成預設的拷貝建構函式,提高原始碼效率。