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

下載本文檔

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

文檔簡介

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也會出錯也會出錯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)自動產(chǎn)生出一個缺省形式的構(gòu)造函數(shù)如果程序中未聲明,系統(tǒng)自動產(chǎn)生出一個缺省形式的構(gòu)造函數(shù)2. 缺省構(gòu)造函數(shù)不能超過一個,否則會有(缺省構(gòu)造函數(shù)不能超過一個,否則會有(warning or error)返返 回回3.拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)注意一種特殊情形,重載運算符注意一種特殊情形,重載運算符“=

3、”與拷貝構(gòu)造的關(guān)系與拷貝構(gòu)造的關(guān)系1.當(dāng)沒有重載運算符“”時:Point p2p1表示調(diào)用Point類的拷貝構(gòu)造函數(shù),與Point p2(p1)等價; 而 Point p2; p2=p1; 此時調(diào)用的是C自動重載運算符函數(shù), 此時不會調(diào)用拷貝構(gòu)造函數(shù)。2.當(dāng)重載運算符“”時:與1相同,Point p2p1表示調(diào)用Point類的拷貝構(gòu)造函數(shù);而 Point p2; 而 p2=p1; 此時調(diào)用的是自定義的重載運算符函數(shù),即Operator,同時參數(shù)傳遞和函數(shù)值返回的原因,會調(diào)用拷貝構(gòu)造函數(shù)兩次。下頁例子#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; 等價于Point p1(p2); p2=p1;運行結(jié)果運行結(jié)果返返 回回2006

5、-11-224.派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù)職責(zé)職責(zé):1. 基類成員:基類構(gòu)造函數(shù)完成2. 內(nèi)嵌對象成員3. 新增成員注意注意:1. 基類構(gòu)造函數(shù),內(nèi)嵌對象構(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)對象中沒有動態(tài)資源申請的數(shù)據(jù)對象,淺拷貝只適合當(dāng)對象中沒有動態(tài)資源申請的數(shù)據(jù)對象,默認(rèn)的、系統(tǒng)自動產(chǎn)生的拷貝構(gòu)造函數(shù)是淺拷貝默認(rèn)的、系統(tǒng)自動產(chǎn)生的拷貝構(gòu)造函數(shù)是淺拷貝2. 在對象中有動態(tài)資源申請的對象時,必須要用深拷貝,在對象中有動態(tài)資源申請的對象時,必須要用深拷貝,否則析構(gòu)會出錯,而且不同的對象在利用拷貝構(gòu)造產(chǎn)否則析構(gòu)會出錯,而且不同的對象在利用拷貝構(gòu)造產(chǎn)生時會指向內(nèi)存的同一段區(qū)域生時會指向內(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();程序運行結(jié)果程序運行結(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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論