拷貝即是通常所說的復(fù)制(Copy)或克隆(Clone),對象的拷貝也就是從現(xiàn)有對象復(fù)制一個“一模一樣”的新對象出來。雖然都是復(fù)制對象,但是不同的復(fù)制方法,復(fù)制出來的新對象卻并非完全一模一樣,對象內(nèi)部存在著一些差異。通常的拷貝方法有兩種,即深拷貝和淺拷貝,那二者之間有何區(qū)別呢?
我的理解是:
1、深拷貝和淺拷貝之間的區(qū)別在于是否復(fù)制了子對象。
2、如果一個類擁有資源(堆,或者是其它系統(tǒng)資源),,當(dāng)這個類的對象發(fā)生復(fù)制過程的時候,資源重新分配,這個過程就是深拷貝,反之對象存在資源,但復(fù)制過程并未復(fù)制資源的情況視為淺拷貝。
當(dāng)用一個已初始化過了的自定義類類型對象去初始化另一個新構(gòu)造的對象的時候,拷貝構(gòu)造函數(shù)就會被自動調(diào)用。也就是說,當(dāng)類的對象需要拷貝時,拷貝構(gòu)造函數(shù)將會被調(diào)用。以下情況都會調(diào)用拷貝構(gòu)造函數(shù):
①、一個對象以值傳遞的方式傳入函數(shù)體:這個好理解,因為傳遞給函數(shù)體的參數(shù)不是 str 而是 _str ,是str的復(fù)制品。所以必然會調(diào)用拷貝構(gòu)造函數(shù)。
②、一個對象以值傳遞的方式從函數(shù)返回 :相當(dāng)于構(gòu)造一個新的對象。
③、一個對象需要通過另外一個對象進行初始化。:同上、
正如您理解那樣 “淺拷貝:只拷貝對象的基本屬性,其他的引用不拷貝,還是保留引用”如果在類中沒有顯式地聲明一個拷貝構(gòu)造函數(shù),那么,編譯器將會自動生成一個默認的拷貝構(gòu)造函數(shù),該構(gòu)造函數(shù)完成對象之間的位拷貝。當(dāng)對象沒有指針時,按照上面的規(guī)則,則一切正常,淺拷貝把數(shù)據(jù)復(fù)制過新對象。但當(dāng)對象有指針時,因為淺拷貝引用不拷貝,所以新對象與舊對象他們指向的是同一個內(nèi)存區(qū),這時當(dāng)釋放內(nèi)存時就出現(xiàn)釋放兩次,出錯了。
這時需要深拷貝..................
所以通常我們需要自己寫拷貝構(gòu)造函數(shù),以免出現(xiàn)錯誤。
//////////////參考資料所得,正確與否歡迎討論、
posted on 2011-09-27 01:24
Yu_ 閱讀(399)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++