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