《第3章_1面相對像》由會(huì)員分享,可在線閱讀,更多相關(guān)《第3章_1面相對像(36頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),*,C+,類與對象,指針,繼承與派生,類成員的進(jìn)一步使用,多態(tài)性與虛函數(shù),重載,類與對象,類的定義格式,在類中要指定成員的訪問權(quán)限,沒有標(biāo)明(默認(rèn))訪問權(quán)限的成員為私有成員。,在類內(nèi)說明訪問控制屬性的先后順序沒有規(guī)定。,在類體內(nèi)進(jìn)行數(shù)據(jù)成員定義時(shí),不允許對數(shù)據(jù)成員進(jìn)行賦值。,當(dāng)在類體外定義函數(shù)時(shí),在類體內(nèi)應(yīng)由函數(shù)原型說明。,類中的成員不能使用,auto,、,extern,、,register,等關(guān)鍵字進(jìn)行修飾。,其他類的對象可以作類的成員,但自身類的對象不允許作該類成員。,通常將類的定義部分存放在一個(gè)用戶自定義
2、的頭文件中,可方便以后使用。,/,說明部分,Class,public:,private:,protected:,;,/,實(shí)現(xiàn)部分,類與對象,類的成員函數(shù),在所定義的成員函數(shù)名之前應(yīng)綴上類名,類名與函數(shù)名之間是作用域運(yùn)算符“:”。,在定義成員函數(shù)時(shí),對帶參數(shù)的函數(shù),要給出參數(shù)的類型和參數(shù)名。而類內(nèi)對應(yīng)的該函數(shù)原型的形參可以只有類型,不寫參數(shù)名。,函數(shù)的返回類型、形式參數(shù)的類型與類體內(nèi)對應(yīng)函數(shù)原型說明的類型要匹配。,當(dāng)在類體外定義的成員函數(shù)較為短小,可以定義為內(nèi)聯(lián)函數(shù)的形式,在定義時(shí)最前面用關(guān)鍵字,inline,修飾。,類與對象,類成員的訪問控制,公有類型定義了類的外部接口,對類來講,任何來自外部
3、的訪問都要通過外部接口來進(jìn)行。,私有成員不允許外部程序代碼直接訪問,這樣,私有成員就被隱藏在類中。,保護(hù)類型同私有類型的差別是在類的繼承和派生是對派生類的影響不同。,類與對象,對象的聲明與使用,;,point p1,p2,p,.,.,#include,class,Tpoint,private:,int,X,Y;,public:,void,point(int,x,int,y);,int,getX()return,X;,int,getY()return,Y;,void,Move(int,int,);,;,void,Tpoint:point(int,x,int,y),X=x;,Y=y;,void,T
4、point:Move(int,xset,int,yset,),X+=,xset,;,Y+=,yset,;,void main(),Tpoint,D1,D2;,D1.point(10,12);,D2.point(7,12);,D1.Move(4,5);,D2.Move(-2,1);,cout,“x1=”D1.getX()”y1=”D1.getY(),endl,;,cout,“x2=”D2.getX()”y2=”D2.getY(),endl,;,X1=14,y1=17,X2=5,y2=13,類與對象,構(gòu)造函數(shù),C+,語言在創(chuàng)建一個(gè)對象時(shí),通過系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)對所創(chuàng)建的對象進(jìn)行初始化。,對象(數(shù)
5、據(jù)成員)的初值通過自動(dòng)調(diào)用構(gòu)造函數(shù)取得,可以通過賦值或調(diào)用已有的成員函數(shù)來改變它。,注意事項(xiàng),該函數(shù)的名字與類名相同,構(gòu)造函數(shù)無返回值,因此不允許定義構(gòu)造函數(shù)的返回值類型,其中包括,void,類型。,該函數(shù)可以有一個(gè)或多個(gè)參數(shù),也可以無參數(shù),無參數(shù)的構(gòu)造函數(shù)稱為默認(rèn)構(gòu)造函數(shù)。,該函數(shù)通常在創(chuàng)建對象時(shí)系統(tǒng)自動(dòng)調(diào)用。如果類內(nèi)沒有定義構(gòu)造函數(shù),系統(tǒng)會(huì)自動(dòng)定義默認(rèn)的構(gòu)造函數(shù)。,一個(gè)類可以有一個(gè)以上的構(gòu)造函數(shù),重載構(gòu)造函數(shù)由其參數(shù)個(gè)數(shù)、類型和排列順序區(qū)分。,#include,class set,int,elems100;,int,size;,int,card;,public:,set(int,i=16)
6、,size=I;,if(size16)size=100;,if(size16)size=20;,cout,“size=”size,endl,;,;,void main(),set s1(64),s2(8),s3;,class point,int,x,y,;,public:,point(int,m=0,int n=0),x=m;,y=n;,/,;,void main(),point p1;,point p2(10);,point p3(10,10);,/,class sub,/,public:,sub();,sub(int,i=30);,sub(int,int,);,sub(float,floa
7、t,);,/,;,void main(),sub ob1(10,10);,sub ob2(3.2,3.4);,sub ob3;/,二義,/,類與對象,拷貝構(gòu)造函數(shù),在初始化時(shí)調(diào)用,以便將一個(gè)已知對象的數(shù)據(jù)成員的值賦值給正在創(chuàng)建的另外一個(gè)同類的對象。,只有一個(gè)參數(shù),并且是對某一個(gè)對象的引用,(,&,),#include,class point,private:,int,X,Y;,public:,point(int,xx=0,int,yy,=0),X=xx;,Y=,yy,;,point(point,int,getX()return,X;,int,getY()return,Y;,point:poin
8、t(point,&p),X=,p.X,;,Y=,p.Y,;,void,main(void,),point A(11,22);,point B(A);,cout,B.getX,(),endl,;,void,f(point,p),cout,p.getY,(),endl,;,void main(),point A(22,23);,f(A,);,void g(),point A(55,66);,return A;,void main(),out,g().getX,(),endl,;,類與對象,析構(gòu)函數(shù),析構(gòu)函數(shù)的功能是用來釋放所創(chuàng)建的對象,主要用來完成對象被刪除前的一些清理工作。,析構(gòu)函數(shù)的名字與類名
9、相同,與構(gòu)造函數(shù)的區(qū)別是名字前面加一個(gè)符號(hào)“,”,,表明它與構(gòu)造函數(shù)的功能相反。析構(gòu)函數(shù)也沒有函數(shù)返回類型。,#include,class demo,private:,int,m;,int,n;,public:,demo(int,x,int,y),m=x;,n=y;,cout,“constructor function is called here,”m“,”n,endl,;,demo(),cout,“Destructor function is called here,”m“,”n,endl,;,;,void main(),demo A(3,5);,for(,int,i=1;i3;i+),d
10、emo,B(i,*3,i*4);,cout,“,程序執(zhí)行完畢!,”,endl,;,Constructor function is called here,3,5,Constructor function is called here,3,4,Destructor function is called here,3,4,Constructor function is called here,6,8,Destructor function is called here,6,8,程序執(zhí)行完畢!,Destructor function is called here,3,5,類與對象,對象的生存期,全局
11、對象,全局對象是被定義在一個(gè)文件中,而它的作用域是在包含該文件的整個(gè)程序中。其缺點(diǎn)是安全性較差,因?yàn)樵谡麄€(gè)程序的各個(gè)文件中都可以改變它。,全局對象定義在函數(shù)體外,定義時(shí)不加修飾符。在某個(gè)文件中定義的全局對象,在其他文件中引用前應(yīng)該說明,在說明時(shí),要在前面加修飾字符,extern,。,局部對象,靜態(tài)對象,內(nèi)部靜態(tài)對象,定義在函數(shù)體或程序塊內(nèi)的靜態(tài)對象稱為內(nèi)部靜態(tài)對象,它的作用域?yàn)槎x它的函數(shù)體或程序塊內(nèi),與局部對象相同;,外部靜態(tài)對象,定義在函數(shù)體外的靜態(tài)對象稱為外部靜態(tài)對象,它的作用域是從定義時(shí)起直到該文件結(jié)束。,外部靜態(tài)對象的作用域是文件級(jí)的,而全局對象的作用域是程序級(jí)的,靜態(tài)對象,存在內(nèi)存
12、的靜態(tài)工作區(qū)。,static,(,),類與對象,類的作用域,類的作用域是介于文件域和函數(shù)域之間的作用域。,類作用域中定義的數(shù)據(jù)成員不能使用,register,、,extern,等修飾,類中定義的成員函數(shù)也不能用,extern,修飾。,類的成員函數(shù)內(nèi)出現(xiàn)了該類的其他成員,該成員函數(shù)具有類的作用域;,使用類域作用符限定的成員具有類作用域;,在引用對象的成員時(shí),該成員具有類作用域。,對于生存期相同的對象,先創(chuàng)建的對象后釋放,后創(chuàng)建的對象先釋放。,#include,class demo,private:,int,m;,int,n;,public:,demo(int,x,int,y),m=x;,n=y;
13、,cout,“,構(gòu)造函數(shù)被調(diào)用,m=”m“,n=”n,endl,;,demo();,void print();,;,void,demo:print,(),cout,“,成員函數(shù),print(),被調(diào)用:,m,=”m“,n=”n,endl,;,demo:demo,(),cout,“,析構(gòu)函數(shù)被調(diào)用,m,=”m“,n=”n,endl,;,void function1(),demo D1(1,1);,static demo D2(2,2);,cout,“,在函數(shù),function1(),中調(diào)用!,n,”;,demo D3(3,3);,static demo D4(4,4);,void main(),
14、demo D5(5,5);,cout,“,在,main(),函數(shù)中,調(diào)用函數(shù),function1(),之前!,”,endl,;,function1();,cout,“,在,main(),函數(shù)中,調(diào)用函數(shù),function1(),之后!,”,m=3,n=3,構(gòu)造函數(shù)被調(diào)用,-m=4,n=4,構(gòu)造函數(shù)被調(diào)用,-m=5,n=5,在,main(),函數(shù)中,調(diào)用函數(shù),function1(),之前!,構(gòu)造函數(shù)被調(diào)用,-m=1,n=1,構(gòu)造函數(shù)被調(diào)用,-m=2,n=2,構(gòu)造函數(shù)被調(diào)用,-m=5,n=5,在函數(shù),function1(),中調(diào)用!,析造函數(shù)被調(diào)用,-m=1,n=1,在,main(),函數(shù)中,調(diào)用
15、函數(shù),function1(),之后!,成員函數(shù),print(),被調(diào)用:,m=5,n=5,析造函數(shù)被調(diào)用,-m=5,n=5,析造函數(shù)被調(diào)用,-m=2,n=2,析造函數(shù)被調(diào)用,-m=4,n=4,析造函數(shù)被調(diào)用,-m=3,n=3,指針,對象指針和,this,指針,對象數(shù)組和對象指針數(shù)組,對象引用,堆對象,Const,特性,漸增式軟件開發(fā),類組合,指針,對象指針的說明和使用,*,*,-,-(),或,(*).,(*).(),#include,using namespace std;,class Ch42class,int,n;,public:,Ch42class(int,x)n,=x;,Ch42cla
16、ss()n=0;,void copy(Ch42class*,ch,),n=,ch,-n;,void print(),cout,“n=”nprint();,n=5,N=2,指針,this,指針,this,指針是由系統(tǒng)在編譯時(shí)自動(dòng)產(chǎn)生一個(gè)指向?qū)ο笞陨淼闹羔槪?dāng)對象調(diào)用一個(gè)成員函數(shù)時(shí),會(huì)把,this,指針作為一個(gè)隱含參數(shù)傳遞給成員函數(shù)。成員函數(shù)接收到該指針后,就可以利用該指針來回訪對象的數(shù)據(jù)成員。,This,指針是屬于對象的,它的類型與對象的類型是一致的。,This,指針通常供系統(tǒng)用于判斷成員函數(shù)所使用的到底是哪一個(gè)數(shù)據(jù)成員副本。但是,當(dāng)需要在一個(gè)成員函數(shù)內(nèi)標(biāo)識(shí)被該成員函數(shù)操作的對象時(shí),就需要顯示使用,this,指針。,#include,using namespace std;,class Ch44class,int,n;,public:,Ch44class(int,x)n,=x;,Ch44class()n=0;,void copy(ch44Class*,ch,),if(this!=,ch,),this-n=,ch,-n;,void print(),cout,“n=”n,endl,;,Ch4