《第3章_1面相對像》由會員分享,可在線閱讀,更多相關(guān)《第3章_1面相對像(36頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,C+,類與對象,指針,繼承與派生,類成員的進一步使用,多態(tài)性與虛函數(shù),重載,類與對象,類的定義格式,在類中要指定成員的訪問權(quán)限,沒有標明(默認)訪問權(quán)限的成員為私有成員。,在類內(nèi)說明訪問控制屬性的先后順序沒有規(guī)定。,在類體內(nèi)進行數(shù)據(jù)成員定義時,不允許對數(shù)據(jù)成員進行賦值。,當(dāng)在類體外定義函數(shù)時,在類體內(nèi)應(yīng)由函數(shù)原型說明。,類中的成員不能使用,auto,、,extern,、,register,等關(guān)鍵字進行修飾。,其他類的對象可以作類的成員,但自身類的對象不允許作該類成員。,通常將類的定義部分存放在一個用戶自定義
2、的頭文件中,可方便以后使用。,/,說明部分,Class,public:,private:,protected:,;,/,實現(xiàn)部分,類與對象,類的成員函數(shù),在所定義的成員函數(shù)名之前應(yīng)綴上類名,類名與函數(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ù)的形式,在定義時最前面用關(guān)鍵字,inline,修飾。,類與對象,類成員的訪問控制,公有類型定義了類的外部接口,對類來講,任何來自外部
3、的訪問都要通過外部接口來進行。,私有成員不允許外部程序代碼直接訪問,這樣,私有成員就被隱藏在類中。,保護類型同私有類型的差別是在類的繼承和派生是對派生類的影響不同。,類與對象,對象的聲明與使用,;,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)建一個對象時,通過系統(tǒng)自動調(diào)用構(gòu)造函數(shù)對所創(chuàng)建的對象進行初始化。,對象(數(shù)
5、據(jù)成員)的初值通過自動調(diào)用構(gòu)造函數(shù)取得,可以通過賦值或調(diào)用已有的成員函數(shù)來改變它。,注意事項,該函數(shù)的名字與類名相同,構(gòu)造函數(shù)無返回值,因此不允許定義構(gòu)造函數(shù)的返回值類型,其中包括,void,類型。,該函數(shù)可以有一個或多個參數(shù),也可以無參數(shù),無參數(shù)的構(gòu)造函數(shù)稱為默認構(gòu)造函數(shù)。,該函數(shù)通常在創(chuàng)建對象時系統(tǒng)自動調(diào)用。如果類內(nèi)沒有定義構(gòu)造函數(shù),系統(tǒng)會自動定義默認的構(gòu)造函數(shù)。,一個類可以有一個以上的構(gòu)造函數(shù),重載構(gòu)造函數(shù)由其參數(shù)個數(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ù),在初始化時調(diào)用,以便將一個已知對象的數(shù)據(jù)成員的值賦值給正在創(chuàng)建的另外一個同類的對象。,只有一個參數(shù),并且是對某一個對象的引用,(,&,),#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ò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、對象,全局對象是被定義在一個文件中,而它的作用域是在包含該文件的整個程序中。其缺點是安全性較差,因為在整個程序的各個文件中都可以改變它。,全局對象定義在函數(shù)體外,定義時不加修飾符。在某個文件中定義的全局對象,在其他文件中引用前應(yīng)該說明,在說明時,要在前面加修飾字符,extern,。,局部對象,靜態(tài)對象,內(nèi)部靜態(tài)對象,定義在函數(shù)體或程序塊內(nèi)的靜態(tài)對象稱為內(nèi)部靜態(tài)對象,它的作用域為定義它的函數(shù)體或程序塊內(nèi),與局部對象相同;,外部靜態(tài)對象,定義在函數(shù)體外的靜態(tài)對象稱為外部靜態(tài)對象,它的作用域是從定義時起直到該文件結(jié)束。,外部靜態(tài)對象的作用域是文件級的,而全局對象的作用域是程序級的,靜態(tài)對象,存在內(nèi)存
12、的靜態(tài)工作區(qū)。,static,(,),類與對象,類的作用域,類的作用域是介于文件域和函數(shù)域之間的作用域。,類作用域中定義的數(shù)據(jù)成員不能使用,register,、,extern,等修飾,類中定義的成員函數(shù)也不能用,extern,修飾。,類的成員函數(shù)內(nèi)出現(xiàn)了該類的其他成員,該成員函數(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)在編譯時自動產(chǎn)生一個指向?qū)ο笞陨淼闹羔?,?dāng)對象調(diào)用一個成員函數(shù)時,會把,this,指針作為一個隱含參數(shù)傳遞給成員函數(shù)。成員函數(shù)接收到該指針后,就可以利用該指針來回訪對象的數(shù)據(jù)成員。,This,指針是屬于對象的,它的類型與對象的類型是一致的。,This,指針通常供系統(tǒng)用于判斷成員函數(shù)所使用的到底是哪一個數(shù)據(jù)成員副本。但是,當(dāng)需要在一個成員函數(shù)內(nèi)標識被該成員函數(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