復(fù)制構(gòu)造函數(shù)

復(fù)制構(gòu)造函數(shù)

ID:37832950

大小:151.15 KB

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

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

復(fù)制構(gòu)造函數(shù)_第1頁(yè)
復(fù)制構(gòu)造函數(shù)_第2頁(yè)
復(fù)制構(gòu)造函數(shù)_第3頁(yè)
復(fù)制構(gòu)造函數(shù)_第4頁(yè)
復(fù)制構(gòu)造函數(shù)_第5頁(yè)
資源描述:

《復(fù)制構(gòu)造函數(shù)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)

1、拷貝構(gòu)造函數(shù)C++中對(duì)象的復(fù)制就如同“克隆”,用一個(gè)已有的對(duì)象快速地復(fù)制出多個(gè)完全相同的對(duì)象。一般而言,以下三種情況都會(huì)使用到對(duì)象的復(fù)制:(1)建立一個(gè)新對(duì)象,并用另一個(gè)同類的已有對(duì)象對(duì)新對(duì)象進(jìn)行初始化,例如:classRect{private:intwidth;intheight;};Rectrect1;Rectrect2(rect1);//使用rect1初始化rect2,此時(shí)會(huì)進(jìn)行對(duì)象的復(fù)制(2)當(dāng)函數(shù)的參數(shù)為類的對(duì)象時(shí),這時(shí)調(diào)用此函數(shù)時(shí)使用的是值傳遞,也會(huì)產(chǎn)生對(duì)象的復(fù)制,例如:voidfun1(Rectrect){...}intmain(){Rectrect1;fun

2、1(rect1);//此時(shí)會(huì)進(jìn)行對(duì)象的復(fù)制return0;}(3)函數(shù)的返回值是類的對(duì)象時(shí),在函數(shù)調(diào)用結(jié)束時(shí),需要將函數(shù)中的對(duì)象復(fù)制一個(gè)臨時(shí)對(duì)象并傳給改函數(shù)的調(diào)用處,例如:Rectfun2(){Rectrect;returnrect;}intmain(){Rectrect1;rect1=fun2();//在fun2返回對(duì)象時(shí),會(huì)執(zhí)行對(duì)象復(fù)制,復(fù)制出一臨時(shí)對(duì)象,//然后將此臨時(shí)對(duì)象“賦值”給rect1return0;}對(duì)象的復(fù)制都是通過(guò)一種特殊的構(gòu)造函數(shù)來(lái)完成的,這種特殊的構(gòu)造函數(shù)就是拷貝構(gòu)造函數(shù)(copyconstructor,也叫復(fù)制構(gòu)造函數(shù))??截悩?gòu)造函數(shù)在大多數(shù)情況下

3、都很簡(jiǎn)單,甚至在我們都不知道它存在的情況下也能很好發(fā)揮作用,但是在一些特殊情況下,特別是在對(duì)象里有動(dòng)態(tài)成員的時(shí)候,就需要我們特別小心地處理拷貝構(gòu)造函數(shù)了。下面我們就來(lái)看看拷貝構(gòu)造函數(shù)的使用。一、默認(rèn)拷貝構(gòu)造函數(shù)很多時(shí)候在我們都不知道拷貝構(gòu)造函數(shù)的情況下,傳遞對(duì)象給函數(shù)參數(shù)或者函數(shù)返回對(duì)象都能很好的進(jìn)行,這是因?yàn)榫幾g器會(huì)給我們自動(dòng)產(chǎn)生一個(gè)拷貝構(gòu)造函數(shù),這就是“默認(rèn)拷貝構(gòu)造函數(shù)”,這個(gè)構(gòu)造函數(shù)很簡(jiǎn)單,僅僅使用“老對(duì)象”的數(shù)據(jù)成員的值對(duì)“新對(duì)象”的數(shù)據(jù)成員一一進(jìn)行賦值,它一般具有以下形式:Rect::Rect(constRect&r){width=r.width;height=r

4、.height;}當(dāng)然,以上代碼不用我們編寫,編譯器會(huì)為我們自動(dòng)生成。但是如果認(rèn)為這樣就可以解決對(duì)象的復(fù)制問(wèn)題,那就錯(cuò)了,讓我們來(lái)考慮以下一段代碼:classRect{public:Rect()//構(gòu)造函數(shù),計(jì)數(shù)器加1{count++;}~Rect()//析構(gòu)函數(shù),計(jì)數(shù)器減1{count--;}staticintgetCount()//返回計(jì)數(shù)器的值{returncount;}private:intwidth;intheight;staticintcount;//一靜態(tài)成員做為計(jì)數(shù)器};intRect::count=0;//初始化計(jì)數(shù)器intmain(){Rectrect1

5、;cout<<"ThecountofRect:"<

6、對(duì)象個(gè)數(shù),按照理解,此時(shí)應(yīng)該有兩個(gè)對(duì)象存在,但實(shí)際程序運(yùn)行時(shí),輸出的都是1,反應(yīng)出只有1個(gè)對(duì)象。此外,在銷毀對(duì)象時(shí),由于會(huì)調(diào)用銷毀兩個(gè)對(duì)象,類的析構(gòu)函數(shù)會(huì)調(diào)用兩次,此時(shí)的計(jì)數(shù)器將變?yōu)樨?fù)數(shù)。出現(xiàn)這些問(wèn)題最根本就在于在復(fù)制對(duì)象時(shí),計(jì)數(shù)器沒(méi)有遞增,解決的辦法就是重新編寫拷貝構(gòu)造函數(shù),在拷貝構(gòu)造函數(shù)中加入對(duì)計(jì)數(shù)器的處理,形成的拷貝構(gòu)造函數(shù)如下:classRect{public:Rect()//構(gòu)造函數(shù),計(jì)數(shù)器加1{count++;}Rect(constRect&r)//拷貝構(gòu)造函數(shù){width=r.width;height=r.height;count++;//計(jì)數(shù)器加1}~Rec

7、t()//析構(gòu)函數(shù),計(jì)數(shù)器減1{count--;}staticintgetCount()//返回計(jì)數(shù)器的值{returncount;}private:intwidth;intheight;staticintcount;//一靜態(tài)成員做為計(jì)數(shù)器};自己編寫拷貝構(gòu)造函數(shù)又可以分為兩種情況——淺拷貝與深拷貝。二、淺拷貝所謂淺拷貝,指的是在對(duì)象復(fù)制時(shí),只是對(duì)對(duì)象中的數(shù)據(jù)成員進(jìn)行簡(jiǎn)單的賦值,上面的例子都是屬于淺拷貝的情況,默認(rèn)拷貝構(gòu)造函數(shù)執(zhí)行的也是淺拷貝。大多情況下“淺拷貝”已經(jīng)能很好地工作了,但是一旦對(duì)象存在了動(dòng)態(tài)成員,那

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

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

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(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)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。