C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)

C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)

ID:37909344

大?。?0.00 KB

頁(yè)數(shù):7頁(yè)

時(shí)間:2019-06-02

C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)_第1頁(yè)
C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)_第2頁(yè)
C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)_第3頁(yè)
C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)_第4頁(yè)
C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)_第5頁(yè)
資源描述:

《C++類(lèi)對(duì)象的深拷貝、淺拷貝構(gòu)造函數(shù)》由會(huì)員上傳分享,免費(fèi)在線(xiàn)閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。

1、在學(xué)習(xí)這一章內(nèi)容前我們已經(jīng)學(xué)習(xí)過(guò)了類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)的相關(guān)知識(shí),對(duì)于普通類(lèi)型的對(duì)象來(lái)說(shuō),他們之間的復(fù)制是很簡(jiǎn)單的,例如:inta=10;intb=a;自己定義的類(lèi)的對(duì)象同樣是對(duì)象,誰(shuí)也不能阻止我們用以下的方式進(jìn)行復(fù)制,例如:#includeusingnamespacestd;classTest{public:Test(inttemp){p1=temp;}protected:intp1;};voidmain(){Testa(99);Testb=a;}普通對(duì)象和類(lèi)對(duì)象同為對(duì)象,他們之間的特性有相似之處也有不同之處,類(lèi)對(duì)象內(nèi)部存在成員變量,而普通對(duì)象是沒(méi)有的,當(dāng)同樣

2、的復(fù)制方法發(fā)生在不同的對(duì)象上的時(shí)候,那么系統(tǒng)對(duì)他們進(jìn)行的操作也是不一樣的,就類(lèi)對(duì)象而言,相同類(lèi)型的類(lèi)對(duì)象是通過(guò)拷貝構(gòu)造函數(shù)來(lái)完成整個(gè)復(fù)制過(guò)程的,在上面的代碼中,我們并沒(méi)有看到拷貝構(gòu)造函數(shù),同樣完成了復(fù)制工作,這又是為什么呢?因?yàn)楫?dāng)一個(gè)類(lèi)沒(méi)有自定義的拷貝構(gòu)造函數(shù)的時(shí)候系統(tǒng)會(huì)自動(dòng)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),來(lái)完成復(fù)制工作。下面,我們?yōu)榱苏f(shuō)明情況,就普通情況而言(以上面的代碼為例),我們來(lái)自己定義一個(gè)與系統(tǒng)默認(rèn)拷貝構(gòu)造函數(shù)一樣的拷貝構(gòu)造函數(shù),看看它的內(nèi)部是如何工作的!代碼如下:#includeusingnamespacestd;classTest{public:Test

3、(inttemp){p1=temp;}Test(Test&c_t)//這里就是自定義的拷貝構(gòu)造函數(shù){cout<<"進(jìn)入copy構(gòu)造函數(shù)"

4、自動(dòng)調(diào)用,如果你沒(méi)有自定義拷貝構(gòu)造函數(shù)的時(shí)候系統(tǒng)將會(huì)提供給一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)來(lái)完成這個(gè)過(guò)程,上面代碼的復(fù)制核心語(yǔ)句就是通過(guò)Test(Test&c_t)拷貝構(gòu)造函數(shù)內(nèi)的p1=c_t.p1;語(yǔ)句完成的。如果取掉這句代碼,那么b對(duì)象的p1屬性將得到一個(gè)未知的隨機(jī)值;下面我們來(lái)討論一下關(guān)于淺拷貝和深拷貝的問(wèn)題。就上面的代碼情況而言,很多人會(huì)問(wèn)到,既然系統(tǒng)會(huì)自動(dòng)提供一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù)來(lái)處理復(fù)制,那么我們沒(méi)有意義要去自定義拷貝構(gòu)造函數(shù)呀,對(duì),就普通情況而言這的確是沒(méi)有必要的,但在某寫(xiě)狀況下,類(lèi)體內(nèi)的成員是需要開(kāi)辟動(dòng)態(tài)開(kāi)辟堆內(nèi)存的,如果我們不自定義拷貝構(gòu)造函數(shù)而讓系統(tǒng)自己處理,那么就會(huì)導(dǎo)致

5、堆內(nèi)存的所屬權(quán)產(chǎn)生混亂,試想一下,已經(jīng)開(kāi)辟的一端堆地址原來(lái)是屬于對(duì)象a的,由于復(fù)制過(guò)程發(fā)生,b對(duì)象取得是a已經(jīng)開(kāi)辟的堆地址,一旦程序產(chǎn)生析構(gòu),釋放堆的時(shí)候,計(jì)算機(jī)是不可能清楚這段地址是真正屬于誰(shuí)的,當(dāng)連續(xù)發(fā)生兩次析構(gòu)的時(shí)候就出現(xiàn)了運(yùn)行錯(cuò)誤。為了更詳細(xì)的說(shuō)明問(wèn)題,請(qǐng)看如下的代碼。#includeusingnamespacestd;classInternet{public:Internet(char*name,char*address){cout<<"載入構(gòu)造函數(shù)"

6、s,address);cname=newchar[strlen(name)+1];if(cname!=NULL){strcpy(Internet::cname,name);}}Internet(Internet&temp){cout<<"載入COPY構(gòu)造函數(shù)"

7、Internet(){cout<<"載入析構(gòu)函數(shù)!";delete[]cname;cin.get();}voidshow();protected:charname[20];charaddress[30];char*cname;};voidInternet::show(){cout<}voidtest(Internetts){cout<<"載入test函數(shù)"<}voidmain(){Interneta("中國(guó)軟件開(kāi)發(fā)實(shí)驗(yàn)室","www.cndev-lab.c

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶(hù)上傳,版權(quán)歸屬用戶(hù),天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶(hù)請(qǐng)聯(lián)系客服處理。