第十章 構(gòu)造函數(shù)和析構(gòu)函數(shù).ppt_第1頁
第十章 構(gòu)造函數(shù)和析構(gòu)函數(shù).ppt_第2頁
第十章 構(gòu)造函數(shù)和析構(gòu)函數(shù).ppt_第3頁
第十章 構(gòu)造函數(shù)和析構(gòu)函數(shù).ppt_第4頁
第十章 構(gòu)造函數(shù)和析構(gòu)函數(shù).ppt_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第十章 構(gòu)造函數(shù)和析構(gòu)函數(shù),1.構(gòu)造函數(shù),作用: 一個類的構(gòu)造 函數(shù)將在定義該類對象時自動調(diào)用,完成給對象賦初值(對象的初始化函數(shù)) 特點: 與該類同名 不帶任何返回類型,也不需要返回任何值,因為一個類的構(gòu)造函數(shù)的隱含返回類型是這個類的本身。 可建立重載的多個構(gòu)造函數(shù)(有參、無參、不同參數(shù)) 可建立具有默認參數(shù)值的構(gòu)造函數(shù),Class room private: float squares=0.3025; ; 在程序編譯階段會出現(xiàn)“類成員不能設(shè)置初值”的錯誤信息,解決的方式是定義一個與類名相同的函數(shù)構(gòu)造函數(shù),Examples,Class room private: float squares;

2、 float ledge; float sedge; public: room( ) squares=0.3025; ledge=6.0; sedge=4.8; room(float sq , float l , float se ); ; (續(xù)下頁),room: room(float sq , float l , float se ) squares=sq; ledge=l; sedge=se; void main( ) room room1; room room2(1.2,7,6.6); ,注意:與普通函數(shù)不同的是,如果在創(chuàng)建對象時沒有向構(gòu)造函數(shù)傳遞實參,則在對象名的后面不需要加括號。,利

3、用構(gòu)造函數(shù)進行類型轉(zhuǎn)換,對于用戶自定義類型數(shù)據(jù),在一定的條件下,不同類型的數(shù)據(jù)之間可以相互轉(zhuǎn)換:自動轉(zhuǎn)換和強制轉(zhuǎn)換。這些轉(zhuǎn)換都是通過構(gòu)造函數(shù)實現(xiàn)的。 只有一個參數(shù)的構(gòu)造函數(shù)實現(xiàn)類型的自動轉(zhuǎn)換。,【例】 只有一個參數(shù)的構(gòu)造函數(shù)實現(xiàn)類型的自動轉(zhuǎn)換class B int i; public:B()cout調(diào)用構(gòu)造函數(shù)B()!n; class Aint i; public:A()cout調(diào)用構(gòu)造函數(shù)A()!n;A(int a) i=a; cout i=it調(diào)用構(gòu)造函數(shù)A(int)!n;A(B y,int a=10)i=a;cout i=it調(diào)用構(gòu)造函數(shù)A(B)!n;,void main()A a1(1

4、0); /A A a2=20; /B a2=50; /C B b; /D A a3=b; /E a3=b; /F,i=10 調(diào)用構(gòu)造函數(shù)A(int)!,i=20 調(diào)用構(gòu)造函數(shù)A(int)!,i=50 調(diào)用構(gòu)造函數(shù)A(int)!,調(diào)用構(gòu)造函數(shù)B()!,i=10 調(diào)用構(gòu)造函數(shù)A(B)!,i=10 調(diào)用構(gòu)造函數(shù)A(B)!,初始化,等價于 A a2(20),類型轉(zhuǎn)換,初始化,等價于 A a3(b,10),類型轉(zhuǎn)換,由上例可見,當一個類能夠創(chuàng)建帶有一個實參(假設(shè)類型為T)的對象時,可進行下列操作: (1)在創(chuàng)建對象時可以用賦值語句進行初始化。 (2)對已創(chuàng)建的對象,可以將T類型的數(shù)據(jù)賦給該對象。此時會產(chǎn)

5、生一個臨時對象,且當賦值完畢時立即撤消該臨時對象。 對于多個參數(shù)的構(gòu)造函數(shù),則可利用它進行強制類型轉(zhuǎn)換。 用構(gòu)造函數(shù)進行類型強制轉(zhuǎn)換的一般格式為: (),【例】 用構(gòu)造函數(shù)進行強制類型轉(zhuǎn)換class Csampleint x,y; public:CSample(int a,int b)x=a;y=b;cout“x=”xt“y=”yt“調(diào)用了構(gòu)造函數(shù)!n; void main (void) CSample x1(12,105); x1=CSample(45,80); /A,拷貝構(gòu)造函數(shù),能完成拷貝功能的構(gòu)造函數(shù)稱為拷貝構(gòu)造函數(shù)。定義拷貝構(gòu)造函數(shù)的格式如下: :(const public:CPoi

6、nt( )x=0,y=0;CPoint(int vx,int vy) x=vx; y=vy; void Print()coutxtyn; void main()CPoint pt1(100,200);CPoint pt2(pt1); /ACPoint pt3=pt1; /Bpt3=pt2; /Cpt1.Print();pt2.Print();pt3.Print();,調(diào)用自動拷貝函數(shù),調(diào)用自動拷貝函數(shù),簡單的賦值,【例】利用自定義的拷貝構(gòu)造函數(shù)class Cpointint x,y; public:CPoint()x=0,y=0;CPoint(int vx,int vy) x=vx; y=vy

7、; CPoint(Cpoint ,void main()Cpoint pt1(100,200);pt1.Print();Cpoint pt2(pt1); /Apt2.Print();Cpoint pt3=pt1; /Bpt3.Print();cout標志.n;pt3=pt2; /C,調(diào)用自定義拷貝函數(shù),調(diào)用自定義拷貝函數(shù),簡單的賦值,2.析構(gòu)函數(shù),作用: 在對象撤消時被調(diào)用,并用調(diào)用執(zhí)行后才真正撤消對象。 特點: 對類名同名,函數(shù)名前再加 不允許帶任何參數(shù),不允許帶返回類型 由系統(tǒng)執(zhí)行程序時,要撤消對象時自動調(diào)用。,對于定義的非動態(tài)對象,離開它的作用域時被自動撤消,故用系統(tǒng)默認的析構(gòu)函數(shù)即可

8、Array() 對于定義的動態(tài)對象,只有當對其執(zhí)行delete操作時才撤消,否則不會自動撤消,故需自定義該析構(gòu)函數(shù)。 Array() delete a; coutdestructorendl; ,構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用時間:,【例】調(diào)用用戶自定義的析構(gòu)函數(shù)class A private:int i; public:A(int a) i=a; cout i=it調(diào)用了構(gòu)造函數(shù)!n; A() couti=i調(diào)用了析構(gòu)函數(shù)!n; ;,A a(0); /A void main()A a1(10); /BA a2=20; /Ca2=50; /Dcoutmain()函數(shù)結(jié)束!endl;,i=0 調(diào)用了構(gòu)

9、造函數(shù),i=10 調(diào)用了構(gòu)造函數(shù),i=20 調(diào)用了構(gòu)造函數(shù),main()函數(shù)結(jié)束!,i=50 調(diào)用了析構(gòu)函數(shù),i=10 調(diào)用了析構(gòu)函數(shù),i=0 調(diào)用了析構(gòu)函數(shù),【例】 用delete運算符撤消對象時調(diào)用析構(gòu)函數(shù)class circle private:int r; public:circle(int a) r=a;void Print() cout“半徑為:”trendl;circle() cout“r=”r“調(diào)用了析構(gòu)函 數(shù)!n; ;,void main() circle c1(10); c1.Print(); circle *c2=new circle(20); c2-Print(); d

10、elete c2; /A cout結(jié)束main()函數(shù)!nendl;,半徑為:10,半徑為:20,r=20 調(diào)用了析構(gòu)函數(shù)!,結(jié)束main()函數(shù)!,r=10 調(diào)用了析構(gòu)函數(shù)!,3.使用this指針,成員函數(shù)如何正確的引用對象?,定義同一類的多個對象時,每一個對象擁有自己的數(shù)據(jù)成員,但它們共用一份成員函數(shù),當成員函數(shù)處理對象時它們使用this指針,通過this指針指向不同對象來決定使用哪一個對象的數(shù)據(jù)成員。 *this具有如下形式的默認樣式: *const this,class Sample int I; public: Sample(int j=0) I=j; /this-I=j; Samp

11、le add(int k) I+=K; /this-I+=k; return *this; void Display() coutIendl; cout“the value of this ”thisendl; ;,void main() Sample A1(10); A1.Display(); Sample A2=A1.add(5); A2.Display(); ,運行結(jié)果: i=10 the value of this=oxfff4,i=15 the value of this=oxfff2,4.對象成員,一個數(shù)據(jù)成員定義為另一個類的對象對象成員 創(chuàng)建類對象時,也要創(chuàng)建對象成員;用構(gòu)造函數(shù)

12、初始化嵌套對象時,也要用對象成員的構(gòu)造函數(shù)初始化對象成員。用初始化成員列表傳遞對象成員構(gòu)造函數(shù)所需的參數(shù)。,class CEmbedded public: CEmbedded( int Param1, int Param2) / ; class Ccontainer private: CEmbedded embed; public: CContainer( int p1, int p2, int p3):embed(p1,p2) / ;,class A int x,y; public: A(int a,int b) x=a;y=b; void show( ) coutx=xty=yn; ; c

13、lass B int Length,Width; public: B(int a,int b) Length=a;Width=b; void show( ) coutLength=Lengthtwidth=Widthn; ;,【例】 對象成員,class C int r,High; A a1; B b1; public: C(int a,int b,int c,int d):a1(c,d), b1(500,600) r=a;High=b; void show( ) coutr=rtHigh=Highn;a1.show( ); b1.show( ); ; void main(void) C c1(100,200,300,400); c1.show( ); ,R=100 high=200 x=300 y

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論