關(guān)于構(gòu)造函數(shù)_第1頁(yè)
關(guān)于構(gòu)造函數(shù)_第2頁(yè)
關(guān)于構(gòu)造函數(shù)_第3頁(yè)
關(guān)于構(gòu)造函數(shù)_第4頁(yè)
關(guān)于構(gòu)造函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、2006-11-22關(guān)于構(gòu)造函數(shù)關(guān)于構(gòu)造函數(shù)1.構(gòu)造函數(shù)的位置構(gòu)造函數(shù)的位置2.缺省構(gòu)造函數(shù)缺省構(gòu)造函數(shù)3.拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)4.派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)5.深拷貝與淺拷貝深拷貝與淺拷貝2006-11-221.構(gòu)造函數(shù)的位置只能放在公有函數(shù)成員的位置:構(gòu)造函數(shù)的位置只能放在公有函數(shù)成員的位置:#include iostream.hclass Aprivate:/或者或者protected也會(huì)出錯(cuò)也會(huì)出錯(cuò)A()public:int i;void main()/主函數(shù)主函數(shù)A a;/cannot access private member declared in class A /

2、see declaration of A:A返返 回回2006-11-221. 自定義缺省構(gòu)造函數(shù):自定義缺省構(gòu)造函數(shù):1.無參數(shù)無參數(shù) 2.帶帶缺省值缺省值2. 系統(tǒng)默認(rèn)構(gòu)造函數(shù)系統(tǒng)默認(rèn)構(gòu)造函數(shù)構(gòu)造函構(gòu)造函數(shù)兩種數(shù)兩種情形情形2.缺省構(gòu)造函數(shù)缺省構(gòu)造函數(shù)2006-11-221. 如果程序中未聲明,系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)缺省形式的構(gòu)造函數(shù)如果程序中未聲明,系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)缺省形式的構(gòu)造函數(shù)2. 缺省構(gòu)造函數(shù)不能超過一個(gè),否則會(huì)有(缺省構(gòu)造函數(shù)不能超過一個(gè),否則會(huì)有(warning or error)返返 回回3.拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)注意一種特殊情形,重載運(yùn)算符注意一種特殊情形,重載運(yùn)算符“=

3、”與拷貝構(gòu)造的關(guān)系與拷貝構(gòu)造的關(guān)系1.當(dāng)沒有重載運(yùn)算符“”時(shí):Point p2p1表示調(diào)用Point類的拷貝構(gòu)造函數(shù),與Point p2(p1)等價(jià); 而 Point p2; p2=p1; 此時(shí)調(diào)用的是C自動(dòng)重載運(yùn)算符函數(shù), 此時(shí)不會(huì)調(diào)用拷貝構(gòu)造函數(shù)。2.當(dāng)重載運(yùn)算符“”時(shí):與1相同,Point p2p1表示調(diào)用Point類的拷貝構(gòu)造函數(shù);而 Point p2; 而 p2=p1; 此時(shí)調(diào)用的是自定義的重載運(yùn)算符函數(shù),即Operator,同時(shí)參數(shù)傳遞和函數(shù)值返回的原因,會(huì)調(diào)用拷貝構(gòu)造函數(shù)兩次。下頁(yè)例子#include iostream.hclass Pointpublic:Point();Poi

4、nt(Point &p);Point operator =(Point p)this-X=p.X;this-Y=p.Y;coutcall the = operator function !endl;return *this;private:int X,Y;Point:Point () cout構(gòu)造函數(shù)被調(diào)用!endl;Point:Point (Point& p)X=p.X;Y=p.Y;cout拷貝構(gòu)造函數(shù)被調(diào)用!endl;void main()Point p1,p2;/Point p2 = p1; 等價(jià)于Point p1(p2); p2=p1;運(yùn)行結(jié)果運(yùn)行結(jié)果返返 回回2006

5、-11-224.派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)職責(zé)職責(zé):1. 基類成員:基類構(gòu)造函數(shù)完成2. 內(nèi)嵌對(duì)象成員3. 新增成員注意注意:1. 基類構(gòu)造函數(shù),內(nèi)嵌對(duì)象構(gòu)造函數(shù)的局部調(diào)用順序2. 缺省調(diào)用方式舉例舉例2:討論構(gòu)造函數(shù)的調(diào)用次序問題討論構(gòu)造函數(shù)的調(diào)用次序問題class B1/基類B1,構(gòu)造函數(shù)有參數(shù)public:B1(int i) coutconstructing B1 iendl;class B2/基類B2,構(gòu)造函數(shù)有參數(shù)public:B2(int j) coutconstructing B2 jendl;class B3/基類B3,構(gòu)造函數(shù)無參數(shù)public:B3( )coutcon

6、structing B3 *endl;class C: public B2, public B1, public B3 public:C(int a, int b, int c, int d): B1(a),memberB2(d),memberB1(c),B2(b) private:B1 memberB1;B2 memberB2;B3 memberB3;void main( ) C obj(1,2,3,4);認(rèn)真思考并回答其輸出結(jié)果?constructing B2 2constructing B1 1constructing B3 *constructing B1 3constructing

7、B2 4constructing B3 *Press any key to continue返返 回回2006-11-224.深拷貝與淺拷貝深拷貝與淺拷貝1. 淺拷貝只適合當(dāng)對(duì)象中沒有動(dòng)態(tài)資源申請(qǐng)的數(shù)據(jù)對(duì)象,淺拷貝只適合當(dāng)對(duì)象中沒有動(dòng)態(tài)資源申請(qǐng)的數(shù)據(jù)對(duì)象,默認(rèn)的、系統(tǒng)自動(dòng)產(chǎn)生的拷貝構(gòu)造函數(shù)是淺拷貝默認(rèn)的、系統(tǒng)自動(dòng)產(chǎn)生的拷貝構(gòu)造函數(shù)是淺拷貝2. 在對(duì)象中有動(dòng)態(tài)資源申請(qǐng)的對(duì)象時(shí),必須要用深拷貝,在對(duì)象中有動(dòng)態(tài)資源申請(qǐng)的對(duì)象時(shí),必須要用深拷貝,否則析構(gòu)會(huì)出錯(cuò),而且不同的對(duì)象在利用拷貝構(gòu)造產(chǎn)否則析構(gòu)會(huì)出錯(cuò),而且不同的對(duì)象在利用拷貝構(gòu)造產(chǎn)生時(shí)會(huì)指向內(nèi)存的同一段區(qū)域生時(shí)會(huì)指向內(nèi)存的同一段區(qū)域2006-11

8、-22淺拷貝舉例淺拷貝舉例#include iostream.hclass Apublic:char *pchar;int size;A(int rsize,char *pconst);/構(gòu)造函數(shù)構(gòu)造函數(shù)聲明聲明void prt();/輸出字符串信息輸出字符串信息;A:A(int rsize,char *pconst)/構(gòu)造函構(gòu)造函數(shù)定義數(shù)定義size=rsize;pchar=new charsize;for(int i=0;*(pconst+i)!=0;i+)*(pchar+i)=*(pconst+i);*(pchar+i)=*(pconst+i);void A:prt()coutthe s

9、tr is :pcharendl;void main()A a(10,abcde);a.prt();A a1=a;a1.prt();*(a.pchar)=1;a.prt();a1.prt();程序運(yùn)行結(jié)果程序運(yùn)行結(jié)果2006-11-222006-11-22修改成深拷貝修改成深拷貝#include iostream.hclass Apublic:char *pchar;int size;A(int rsize,char *pconst);/構(gòu)造函數(shù)聲明構(gòu)造函數(shù)聲明A()/析構(gòu)函數(shù)析構(gòu)函數(shù)delete pchar;/A(A &a);/拷貝構(gòu)造,深拷貝,聲明拷貝構(gòu)造,深拷貝,聲明void prt();/輸出字符串信息輸出字符串信息;A:A(int rsize,char *pconst)/構(gòu)造函數(shù)定構(gòu)造函數(shù)定義義size=rsize;pchar=new charsize;for(int i=0;*(pconst+i)!=0;i+)*(pchar+i)=*(pconst+i);*(pchar+i)=*(pconst+i);/寫入字符串結(jié)束寫入字符串結(jié)束符符0A:A(A &a)/拷貝構(gòu)造,是深拷貝拷貝構(gòu)造,是深拷貝pchar=new chara.size;for(int i=0;ia.size;i+)*(pchar+i)=*(a.pchar+i);

溫馨提示

  • 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)論