拷貝構(gòu)造函數(shù)c語言,C++拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))詳解_第1頁(yè)
拷貝構(gòu)造函數(shù)c語言,C++拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))詳解_第2頁(yè)
拷貝構(gòu)造函數(shù)c語言,C++拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))詳解_第3頁(yè)
拷貝構(gòu)造函數(shù)c語言,C++拷貝構(gòu)造函數(shù)(復(fù)制構(gòu)造函數(shù))詳解_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論