



下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、拷貝構(gòu)造函數(shù)c語言,C+拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))詳解復(fù)制構(gòu)造函數(shù)是構(gòu)造函數(shù)的一種,也稱拷貝構(gòu)造函數(shù),它只有一個(gè)參數(shù),參數(shù)類型是本類的引用。復(fù)制構(gòu)造函數(shù)的參數(shù)可以是const引用,也可以是非const引用。一般使用前者,這樣既能以常量對(duì)象(初始化后值不能改變的對(duì)象)作為參數(shù),也能以非常量對(duì)象作為參數(shù)去初始化其他對(duì)象。一個(gè)類中寫兩個(gè)復(fù)制構(gòu)造函數(shù),一個(gè)的參數(shù)是const引用,另一個(gè)的參數(shù)是非const引用,也是可以的。如果類的設(shè)計(jì)者不寫復(fù)制構(gòu)造函數(shù),編譯器就會(huì)自動(dòng)生成復(fù)制構(gòu)造函數(shù)。大多數(shù)情況下,其作用是實(shí)現(xiàn)從源對(duì)象到目標(biāo)對(duì)象逐個(gè)字節(jié)的復(fù)制,即使得目標(biāo)對(duì)象的每個(gè)成員變量都變得和源對(duì)象相等。編譯器自
2、動(dòng)生成的復(fù)制構(gòu)造函數(shù)稱為“默認(rèn)復(fù)制構(gòu)造函數(shù)”。注意,默認(rèn)構(gòu)造函數(shù)(即無參構(gòu)造函數(shù))不一定存在,但是復(fù)制構(gòu)造函數(shù)總是會(huì)存在。下面是一個(gè)復(fù)制構(gòu)造函數(shù)的例子。#includeusingnamespacestd;classComplexpublic:doublereal,imag;Complex(doubler,doublei)real=r;imag=i;intmain()Complexcl(1,2);Complexc2(cl);用復(fù)制構(gòu)造函數(shù)初始化c2coutreturn0;第13行給出了初始化c2的參數(shù),即c1o只有編譯器自動(dòng)生成的那個(gè)默認(rèn)復(fù)制構(gòu)造函數(shù)的參數(shù)才能和cl匹配,因此,c2就是以cl為參
3、數(shù),調(diào)用默認(rèn)復(fù)制構(gòu)造函數(shù)進(jìn)行初始化的。初始化的結(jié)果是c2成為cl的復(fù)制品,即c2和cl每個(gè)成員變量的值都相等。如果編寫了復(fù)制構(gòu)造函數(shù),則默認(rèn)復(fù)制構(gòu)造函數(shù)就不存在了。下面是一個(gè)非默認(rèn)復(fù)制構(gòu)造函數(shù)的例子。#includeusingnamespacestd;classComplexpublic:doublereal,imag;Complex(doubler,doublei)real=r;imag=i;Complex(constComplex&c)real=c.real;imag=c.imag;cout;intmain()Complexcl(1,2);Complexc2(cl);調(diào)用復(fù)制構(gòu)造函數(shù)cou
4、treturn0;程序的輸出結(jié)果是:CopyConstructorcalled1,2第9行,復(fù)制構(gòu)造函數(shù)的參數(shù)加不加const對(duì)本程序來說都一樣。但加上const是更好的做法,這樣復(fù)制構(gòu)造函數(shù)才能接受常量對(duì)象作為參數(shù),即才能以常量對(duì)象作為參數(shù)去初始化別的對(duì)象。第17行,就是以c1為參數(shù)調(diào)用第9行的那個(gè)復(fù)制構(gòu)造函數(shù)初始化的。該復(fù)制構(gòu)造函數(shù)執(zhí)行的結(jié)果是使c2和c1相等,此外還輸出CopyConstructorcalled??梢韵胂?,如果將第10行刪去或改成real=2*c.real;imag=imag+1;,那么c2的值就不會(huì)等于cl了。也就是說,自己編寫的復(fù)制構(gòu)造函數(shù)并不一定要做復(fù)制的工作(如果
5、只做復(fù)制工作,那么使用編譯器自動(dòng)生成的默認(rèn)復(fù)制構(gòu)造函數(shù)就行了)。但從習(xí)慣上來講,復(fù)制構(gòu)造函數(shù)還是應(yīng)該完成類似于復(fù)制的工作為好,在此基礎(chǔ)上還可以根據(jù)需要做些別的操作。構(gòu)造函數(shù)不能以本類的對(duì)象作為唯一參數(shù),以免和復(fù)制構(gòu)造函數(shù)相混淆。例如,不能寫如下構(gòu)造函數(shù):Complex(Complexc).復(fù)制構(gòu)造函數(shù)被調(diào)用的三種情況復(fù)制構(gòu)造函數(shù)在以下三種情況下會(huì)被調(diào)用。當(dāng)用一個(gè)對(duì)象去初始化同類的另一個(gè)對(duì)象時(shí),會(huì)引發(fā)復(fù)制構(gòu)造函數(shù)被調(diào)用。例如,下面的兩條語句都會(huì)引發(fā)復(fù)制構(gòu)造函數(shù)的調(diào)用,用以初始化c2。Complexc2(c1);Complexc2=c1;這兩條語句是等價(jià)的。注意,第二條語句是初始化語句,不是賦值語
6、句。賦值語句的等號(hào)左邊是一個(gè)早已有定義的變量,賦值語句不會(huì)引發(fā)復(fù)制構(gòu)造函數(shù)的調(diào)用。例如:Complexc1,c2;c1=c2;c1=c2;這條語句不會(huì)引發(fā)復(fù)制構(gòu)造函數(shù)的調(diào)用,因?yàn)閏1早已生成,已經(jīng)初始化過了。如果函數(shù)F的參數(shù)是類A的對(duì)象,那么當(dāng)F被調(diào)用時(shí),類A的復(fù)制構(gòu)造函數(shù)將被調(diào)用。換句話說,作為形參的對(duì)象,是用復(fù)制構(gòu)造函數(shù)初始化的,而且調(diào)用復(fù)制構(gòu)造函數(shù)時(shí)的參數(shù),就是調(diào)用函數(shù)時(shí)所給的實(shí)參。#includeusingnamespacestd;classApublic:A();A(A&a)cout;voidFunc(Aa)intmain()Aa;Func(a);return0;程序的輸出結(jié)果為:C
7、opyconstructorcalled這是因?yàn)镕unc函數(shù)的形參a在初始化時(shí)調(diào)用了復(fù)制構(gòu)造函數(shù)。前面說過,函數(shù)的形參的值等于函數(shù)調(diào)用時(shí)對(duì)應(yīng)的實(shí)參,現(xiàn)在可以知道這不一定是正確的。如果形參是一個(gè)對(duì)象,那么形參的值是否等于實(shí)參,取決于該對(duì)象所屬的類的復(fù)制構(gòu)造函數(shù)是如何實(shí)現(xiàn)的。例如上面的例子,F(xiàn)unc函數(shù)的形參a的值在進(jìn)入函數(shù)時(shí)是隨機(jī)的,未必等于實(shí)參,因?yàn)閺?fù)制構(gòu)造函數(shù)沒有做復(fù)制的工作。以對(duì)象作為函數(shù)的形參,在函數(shù)被調(diào)用時(shí),生成的形參要用復(fù)制構(gòu)造函數(shù)初始化,這會(huì)帶來時(shí)間上的開銷。如果用對(duì)象的引用而不是對(duì)象作為形參,就沒有這個(gè)問題了。但是以引用作為形參有一定的風(fēng)險(xiǎn),因?yàn)檫@種情況下如果形參的值發(fā)生改變,實(shí)
8、參的值也會(huì)跟著改變。如果要確保實(shí)參的值不會(huì)改變,又希望避免復(fù)制構(gòu)造函數(shù)帶來的開銷,解決辦法就是將形參聲明為對(duì)象的const引用。例如:voidFunction(constComplex&c)這樣,F(xiàn)unction函數(shù)中出現(xiàn)任何有可能導(dǎo)致c的值被修改的語句,都會(huì)引發(fā)編譯錯(cuò)誤。思考題:在上面的Function函數(shù)中,除了賦值語句,還有什么語句有可能改變c的值?例如,是否允許通過c調(diào)用Complex的成員函數(shù)?如果函數(shù)的返冋值是類A的對(duì)象,則函數(shù)返冋時(shí),類A的復(fù)制構(gòu)造函數(shù)被調(diào)用。換言之,作為函數(shù)返回值的對(duì)象是用復(fù)制構(gòu)造函數(shù)初始化的,而調(diào)用復(fù)制構(gòu)造函數(shù)時(shí)的實(shí)參,就是return語句所返回的對(duì)象。例如下
9、面的程序:#includeusingnamespacestd;classApublic:intv;A(intn)v=n;A(constA&a)v=a.v;coutCopyconstructorcalledendl;AFunc()Aa(4);returna;intmain()coutFunc().vendl;return0;程序的輸出結(jié)果是:Copyconstructorcalled4第19行調(diào)用了Func函數(shù),其返回值是一個(gè)對(duì)象,該對(duì)象就是用復(fù)制構(gòu)造函數(shù)初始化的,而且調(diào)用復(fù)制構(gòu)造函數(shù)時(shí),實(shí)參就是第16行return語句所返回的a。復(fù)制構(gòu)造函數(shù)在第9行確實(shí)完成了復(fù)制的工作,所以第19行Func函數(shù)的返回值和第14行的a相等。需要說明的是,有些編譯器出于程序執(zhí)行效率
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T-ZRCMA 001-2024 城市軌道交通智慧實(shí)訓(xùn)系統(tǒng)技術(shù)規(guī)范
- 二零二五年度餐飲店面租賃合同含節(jié)假日促銷活動(dòng)
- 二零二五年度個(gè)人擔(dān)保合同-個(gè)人理財(cái)產(chǎn)品擔(dān)保服務(wù)條款
- 二零二五年度農(nóng)村墓地選購(gòu)與祭祀活動(dòng)組織合同
- 二零二五年度茶飲品牌全國(guó)使用許可合同
- 二零二五年度互聯(lián)網(wǎng)保險(xiǎn)產(chǎn)品銷售委托理財(cái)服務(wù)協(xié)議
- 二零二五年度棋牌室合作伙伴關(guān)系管理與維護(hù)合同
- 2025年度順豐員工勞動(dòng)合同爭(zhēng)議解決機(jī)制合同
- 二零二五年度個(gè)人合同范本:智能家居控制系統(tǒng)研發(fā)合作合同
- 二零二五年度新型工業(yè)園區(qū)委托中介代理出租服務(wù)協(xié)議
- 車站信號(hào)自動(dòng)控制課件:進(jìn)站信號(hào)機(jī)點(diǎn)燈電路
- 民用無人機(jī)操控員執(zhí)照(CAAC)考試復(fù)習(xí)重點(diǎn)題庫(kù)500題(含答案)
- GB/T 6553-2024嚴(yán)酷環(huán)境條件下使用的電氣絕緣材料評(píng)定耐電痕化和蝕損的試驗(yàn)方法
- 瀝青基材料在石油化工設(shè)備熱絕緣中的開發(fā)
- 中職旅游專業(yè)《中國(guó)旅游地理》說課稿
- 煤層底板采動(dòng)破裂深度壓水
- 第15課 列強(qiáng)入侵與中國(guó)人民的反抗斗爭(zhēng)【課件】-中職高一上學(xué)期高教版
- 新人教小學(xué)數(shù)學(xué)六年級(jí)下冊(cè)《成數(shù)》示范課教學(xué)課件
- CAR-T細(xì)胞療法行業(yè)營(yíng)銷策略方案
- 中國(guó)海關(guān)科學(xué)技術(shù)研究中心招聘筆試真題2022
- 四年級(jí)美術(shù)測(cè)國(guó)測(cè)復(fù)習(xí)題答案
評(píng)論
0/150
提交評(píng)論