深拷貝和淺拷貝使用問題

2021-07-02 17:08:09 字數 924 閱讀 8756

定義:

如果類中包含了使用new初始化的指標成員,應當定義乙個複製建構函式,以複製指向的資料,而不是指標,這是深度複製或深拷貝。

複製的另一種形式只是複製指標值,稱為成員複製或淺複製或淺拷貝。它只複製指標資訊,而不會深入「挖掘」以複製指標引用的結構。

c++ primer plus裡深淺拷貝的圖示:

圖中的是深拷貝和淺拷貝示意圖,可見深拷貝中,ditto = motto語句使得ditto指向另一塊新開闢的記憶體存放被拷貝的內容,如果是淺拷貝,ditto也會指向2400位址。這就是區別。

深拷貝和淺拷貝的區別很多文章有講,這裡說下兩者何時採用,具體的例子可以參考部落格:

1. 只要類裡有指標時,就要寫自己版本的拷貝建構函式和賦值操作符函式。這兩個函式中可以拷貝那些被指向的資料結構,從而使每個物件都有自己的拷貝;或者可以採用某種引用計數機制,去跟蹤當前有多少個物件指向某個資料結構。(也可以靜態計數物件的個數,比如c++ primer plus第六版的例子,static int num_strings)

2. 某些類在實現拷貝建構函式和賦值操作符時,可以確信程式中不會做拷貝和賦值操作的時候,去實現它們會得不償失,因此可以:只宣告這些函式(宣告為private成員)而不去定義實現它們。這就防止了會有人去呼叫它們,也防止了編譯器去生成它們。

3. 淺拷貝在構造和析構物件時容易產生問題,如無必要盡量不用淺拷貝。當我們要傳遞複雜結構的資訊,而又不想產生另乙份資料時,可以使用淺拷貝,比如引用傳參。

4. 智慧型指標是淺拷貝概念的增強。比如智慧型指標可以維護乙個引用計數來表明指向某塊記憶體的指標數量,只有當引用計數減至0時,才真正釋放記憶體。

深拷貝和淺拷貝問題

下午遇到乙個關於乙個表的數值拷貝的問題,有點意思,不多說,直接上 記錄玩家的資訊 self.userinfo for i 1,play count do table.insert self.userinfo,self.deskuserlist getuserbydeskstation i 1 end...

深拷貝和淺拷貝

淺拷貝就是物件的資料成員之間的簡單賦值,如你設計了乙個沒有類而沒有提供它的複製建構函式,當用該類的乙個物件去給令乙個物件賦值時所執行的過程就是淺拷貝,如 class a a private int data int main 這一句b a 就是淺拷貝,執行完這句後b.data 5 如果物件中沒有其他...

淺拷貝和深拷貝

以下情況都會呼叫拷貝建構函式 乙個物件以值傳遞的方式傳入函式體 例如 已知class a,class b void func a a void func a a func b b 此時函式對b的操作是呼叫拷貝建構函式後的臨時拷貝物件。多數傳指標 乙個物件以值傳遞的方式從函式返回 如 return b...