《第3章_1面相對像》由會員分享,可在線閱讀,更多相關《第3章_1面相對像(36頁珍藏版)》請在裝配圖網上搜索。
1、單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,C+,類與對象,指針,繼承與派生,類成員的進一步使用,多態性與虛函數,重載,類與對象,類的定義格式,在類中要指定成員的訪問權限,沒有標明(默認)訪問權限的成員為私有成員。,在類內說明訪問控制屬性的先后順序沒有規定。,在類體內進行數據成員定義時,不允許對數據成員進行賦值。,當在類體外定義函數時,在類體內應由函數原型說明。,類中的成員不能使用,auto,、,extern,、,register,等關鍵字進行修飾。,其他類的對象可以作類的成員,但自身類的對象不允許作該類成員。,通常將類的定義部分存放在一個用戶自定義
2、的頭文件中,可方便以后使用。,/,說明部分,Class,public:,private:,protected:,;,/,實現部分,類與對象,類的成員函數,在所定義的成員函數名之前應綴上類名,類名與函數名之間是作用域運算符“:”。,在定義成員函數時,對帶參數的函數,要給出參數的類型和參數名。而類內對應的該函數原型的形參可以只有類型,不寫參數名。,函數的返回類型、形式參數的類型與類體內對應函數原型說明的類型要匹配。,當在類體外定義的成員函數較為短小,可以定義為內聯函數的形式,在定義時最前面用關鍵字,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,類與對象,構造函數,C+,語言在創建一個對象時,通過系統自動調用構造函數對所創建的對象進行初始化。,對象(數
5、據成員)的初值通過自動調用構造函數取得,可以通過賦值或調用已有的成員函數來改變它。,注意事項,該函數的名字與類名相同,構造函數無返回值,因此不允許定義構造函數的返回值類型,其中包括,void,類型。,該函數可以有一個或多個參數,也可以無參數,無參數的構造函數稱為默認構造函數。,該函數通常在創建對象時系統自動調用。如果類內沒有定義構造函數,系統會自動定義默認的構造函數。,一個類可以有一個以上的構造函數,重載構造函數由其參數個數、類型和排列順序區分。,#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;/,二義,/,類與對象,拷貝構造函數,在初始化時調用,以便將一個已知對象的數據成員的值賦值給正在創建的另外一個同類的對象。,只有一個參數,并且是對某一個對象的引用,(,&,),#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,;,類與對象,析構函數,析構函數的功能是用來釋放所創建的對象,主要用來完成對象被刪除前的一些清理工作。,析構函數的名字與類名
9、相同,與構造函數的區別是名字前面加一個符號“,”,,表明它與構造函數的功能相反。析構函數也沒有函數返回類型。,#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,“,程序執行完畢!,”,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,程序執行完畢!,Destructor function is called here,3,5,類與對象,對象的生存期,全局
11、對象,全局對象是被定義在一個文件中,而它的作用域是在包含該文件的整個程序中。其缺點是安全性較差,因為在整個程序的各個文件中都可以改變它。,全局對象定義在函數體外,定義時不加修飾符。在某個文件中定義的全局對象,在其他文件中引用前應該說明,在說明時,要在前面加修飾字符,extern,。,局部對象,靜態對象,內部靜態對象,定義在函數體或程序塊內的靜態對象稱為內部靜態對象,它的作用域為定義它的函數體或程序塊內,與局部對象相同;,外部靜態對象,定義在函數體外的靜態對象稱為外部靜態對象,它的作用域是從定義時起直到該文件結束。,外部靜態對象的作用域是文件級的,而全局對象的作用域是程序級的,靜態對象,存在內存
12、的靜態工作區。,static,(,),類與對象,類的作用域,類的作用域是介于文件域和函數域之間的作用域。,類作用域中定義的數據成員不能使用,register,、,extern,等修飾,類中定義的成員函數也不能用,extern,修飾。,類的成員函數內出現了該類的其他成員,該成員函數具有類的作用域;,使用類域作用符限定的成員具有類作用域;,在引用對象的成員時,該成員具有類作用域。,對于生存期相同的對象,先創建的對象后釋放,后創建的對象先釋放。,#include,class demo,private:,int,m;,int,n;,public:,demo(int,x,int,y),m=x;,n=y;
13、,cout,“,構造函數被調用,m=”m“,n=”n,endl,;,demo();,void print();,;,void,demo:print,(),cout,“,成員函數,print(),被調用:,m,=”m“,n=”n,endl,;,demo:demo,(),cout,“,析構函數被調用,m,=”m“,n=”n,endl,;,void function1(),demo D1(1,1);,static demo D2(2,2);,cout,“,在函數,function1(),中調用!,n,”;,demo D3(3,3);,static demo D4(4,4);,void main(),
14、demo D5(5,5);,cout,“,在,main(),函數中,調用函數,function1(),之前!,”,endl,;,function1();,cout,“,在,main(),函數中,調用函數,function1(),之后!,”,m=3,n=3,構造函數被調用,-m=4,n=4,構造函數被調用,-m=5,n=5,在,main(),函數中,調用函數,function1(),之前!,構造函數被調用,-m=1,n=1,構造函數被調用,-m=2,n=2,構造函數被調用,-m=5,n=5,在函數,function1(),中調用!,析造函數被調用,-m=1,n=1,在,main(),函數中,調用
15、函數,function1(),之后!,成員函數,print(),被調用:,m=5,n=5,析造函數被調用,-m=5,n=5,析造函數被調用,-m=2,n=2,析造函數被調用,-m=4,n=4,析造函數被調用,-m=3,n=3,指針,對象指針和,this,指針,對象數組和對象指針數組,對象引用,堆對象,Const,特性,漸增式軟件開發,類組合,指針,對象指針的說明和使用,*,*,-,-(),或,(*).,(*).(),#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,指針是由系統在編譯時自動產生一個指向對象自身的指針,當對象調用一個成員函數時,會把,this,指針作為一個隱含參數傳遞給成員函數。成員函數接收到該指針后,就可以利用該指針來回訪對象的數據成員。,This,指針是屬于對象的,它的類型與對象的類型是一致的。,This,指針通常供系統用于判斷成員函數所使用的到底是哪一個數據成員副本。但是,當需要在一個成員函數內標識被該成員函數操作的對象時,就需要顯示使用,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