C++程序設(shè)計(jì)及互動(dòng)多媒體開發(fā) 課件 第3章 類和對(duì)象_第1頁
C++程序設(shè)計(jì)及互動(dòng)多媒體開發(fā) 課件 第3章 類和對(duì)象_第2頁
C++程序設(shè)計(jì)及互動(dòng)多媒體開發(fā) 課件 第3章 類和對(duì)象_第3頁
C++程序設(shè)計(jì)及互動(dòng)多媒體開發(fā) 課件 第3章 類和對(duì)象_第4頁
C++程序設(shè)計(jì)及互動(dòng)多媒體開發(fā) 課件 第3章 類和對(duì)象_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++程序設(shè)計(jì)第3章類和對(duì)象第1節(jié)類和對(duì)象第2節(jié)構(gòu)造函數(shù)與析構(gòu)函數(shù)第3節(jié)常成員與靜態(tài)成員第4節(jié)友元函數(shù)第5節(jié)繼承與派生第6節(jié)虛函數(shù)與多態(tài)性第1節(jié)類和對(duì)象類和對(duì)象的定義對(duì)象的訪問訪問權(quán)限*this指針1.1類和對(duì)象的定義從結(jié)構(gòu)體說起考慮用結(jié)構(gòu)體描述一個(gè)學(xué)生信息,參考例1-6。structstudent//結(jié)構(gòu)體定義{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;};例1-6中,為了計(jì)算學(xué)生的平均分,結(jié)構(gòu)體外部有一個(gè)函數(shù):floatAverage(structstudentstu){ return(stu.MathScore+stu.EnglishScore+stu.PoliticsScore)/3;}考慮:能不能讓Average函數(shù)放在結(jié)構(gòu)里內(nèi)部呢?使用戶看到結(jié)構(gòu)體的時(shí)候就知道有這個(gè)針對(duì)結(jié)構(gòu)體計(jì)算平均分的函數(shù)。答案是可以的:structstudent//結(jié)構(gòu)體定義{charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;floatAverage()//參數(shù)不再需要{ return(MathScore+EnglishScore+PoliticsScore)/3;}};——這樣就變成了“類”等同于:classstudent//類的定義{public:charname[30];charnum[10];charsex;intage;floatMathScore;floatEnglishScore;floatPoliticsScore;floatAverage()//參數(shù)不再需要{ return(MathScore+EnglishScore+PoliticsScore)/3;}};類和對(duì)象類:封裝了物體各種屬性(成員變量)和方法(成員函數(shù))的數(shù)據(jù)類型對(duì)象:由“類”這種數(shù)據(jù)類型定義出來的“變量”,或稱類的實(shí)例。e.g.使用前述Student類定義兩個(gè)學(xué)生對(duì)象,以及一個(gè)對(duì)象的指針:studentstu1,stu2;//Student為類,stu1、stu2為對(duì)象student*pStu;再如:一個(gè)圓柱類classCylinder{public:doublex,y;//底面圓心坐標(biāo)doubler,h;//底面圓半徑,圓柱高doubleArea(double&Sd,double&Sc);//函數(shù)聲明inlinedoubleVolume()//內(nèi)聯(lián)函數(shù){return3.1415926*r*r*h;}};doubleCylinder::Area(double&Sd/*底面積*/,double&Sc/*側(cè)面積*/)//函數(shù)定義寫在類外部{doubleS/*表面積*/;Sd=3.1415926*pow(r,2);Sc=2*3.1415926*r*h;S=Sc+2*Sd;returnS;}1.2對(duì)象的訪問使用點(diǎn)號(hào)運(yùn)算符

格式:對(duì)象.成員使用箭頭運(yùn)算符

格式:對(duì)象指針->成員e.gCylinderc1;c1.x=10;c1.y=20;c1.r=5;c1.h=8;doublevolume_c1=c1.Volume();

Cylinderc2,*p;p=&c2;p->x=25;p->y=15;p->r=8;p->h=6;doublevolume_c2=p->Volume();例3-1改寫例1-5中圓柱,使用類來表達(dá)#include<iostream>usingnamespacestd;constdoublePI=3.1215926535;classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

doubleArea(double&Sd,double&Sc);

//函數(shù)聲明

inlinedoubleVolume()//函數(shù)聲明//內(nèi)聯(lián)函數(shù)

{return3.1415926*r*r*h;}};//函數(shù)定義寫在類外部doubleCylinder::Area(double&Sd/*底面積*/,double&Sc/*側(cè)面積*/){doubleS/*表面積*/;Sd=PI*r*r;Sc=2*PI*r*h;S=Sc+2*Sd;returnS;}intmain()//主函數(shù){Cylinderc1;doublevolume;doublearea_surface,area_bottom,area_side;

//對(duì)象使用.運(yùn)算符訪問成員

c1.x=10;c1.y=20;c1.r=5;c1.h=8;volume=c1.Volume();area_surface=c1.Area(area_bottom,area_side);cout<<"圓柱c1的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;

Cylinderc2,*p;p=&c2;

//指針使用->運(yùn)算符訪問成員

p->x=25;p->y=15;p->r=8;p->h=6;volume=p->Volume();area_surface=p->Area(area_bottom,area_side);cout<<"圓柱c2的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;return0;}1.3訪問權(quán)限public:公有訪問權(quán)限

對(duì)象內(nèi)部和外部都能訪問private:私有訪問權(quán)限

只有對(duì)象內(nèi)部才能訪問,外部不能訪問e.g.classA{public:inta;private:intb;public:A(){}}voidmain(){AmyA;myA.a=1;//√myA.b=2;//編譯提示私有成員不能訪問}*1.4this指針this指針是一個(gè)隱含的指針,它是指向?qū)ο蟊旧?,代表了?duì)象的地址對(duì)象調(diào)用成員函數(shù)時(shí),成員函數(shù)除了接受實(shí)參外,還接受到了一個(gè)對(duì)象的地址。這個(gè)地址被一個(gè)隱含的形參this指針?biāo)@取。所有對(duì)數(shù)據(jù)成員的訪問都隱含地被加上前綴this->。例如:x=0;等價(jià)于this->x=0。例:繼續(xù)思考前例,增加一個(gè)帶參數(shù)的重載構(gòu)造函數(shù)e.g.classA{public:inta;private:intb;public:A(){}A(inta,intb){a=a;//?b=b;//?}print(){cout<<"a="<<a<<",b="<<b<<endl;}};voidmain(){AmyA;myA.a=1;//√

//myA.b=2;//×不能訪問myA.print();AmyA2(1,2);myA2.print();}this->a=a;this->b=b;第2節(jié)構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)析構(gòu)函數(shù)2.1構(gòu)造函數(shù)考慮前述圓柱Cylinder類,如何對(duì)成員變量進(jìn)行初始化?如何對(duì)圓心坐標(biāo)(x,y)初始化為(0,0)?并把底面半徑r和高h(yuǎn)初始成為1?在main()函數(shù)中?e.g.voidmain(){Cylinderc;c.x=0;c.y=0;c.r=1;c.h=1;……}類中加一個(gè)init函數(shù),給main函數(shù)調(diào)用?e.g.voidCylinder::init()

{x=0;y=0;r=1;h=1;}能不能在定義對(duì)象的時(shí)候類自己就能進(jìn)行初始化?

——構(gòu)造函數(shù)構(gòu)造函數(shù)是對(duì)象被定義時(shí)自動(dòng)被調(diào)用的函數(shù)(在創(chuàng)建對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用,程序中不能直接調(diào)用)構(gòu)造函數(shù)與類名相同構(gòu)造函數(shù)無返回值構(gòu)造函數(shù)可以有多個(gè),即可以重載如果代碼中沒有定義構(gòu)造函數(shù),C++會(huì)提供一個(gè)默認(rèn)的構(gòu)造函數(shù)例3-2繼續(xù)改寫3-1,使用構(gòu)造函數(shù)進(jìn)行初始化#include<iostream>usingnamespacestd;constdoublePI=3.1415926535;classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

Cylinder(){//構(gòu)造函數(shù)x=0;y=0;r=1;h=1;}Cylinder(doublex0,doubley0,doubler0,doubleh0)//重載構(gòu)造函數(shù){x=x0;y=y0;r=r0;h=h0;}inlinedoubleVolume()//內(nèi)聯(lián)函數(shù)

{return3.1415926*r*r*h;}

//函數(shù)定義寫在類內(nèi)部,沒有inline,//多數(shù)編譯器也會(huì)當(dāng)成內(nèi)聯(lián)函數(shù)doubleArea(double&Sd,double&Sc){doubleS/*表面積*/;Sd=PI*r*r;Sc=2*PI*r*h;S=Sc+2*Sd;returnS;}};intmain()//主函數(shù){

Cylinderc1;//自動(dòng)調(diào)用構(gòu)造函數(shù)

doublevolume;doublearea_surface,area_bottom,area_side;volume=c1.Volume();area_surface=c1.Area(area_bottom,area_side);cout<<"圓柱c1的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;

Cylinderc2(10,10,5,4);

//自動(dòng)調(diào)用帶參數(shù)的構(gòu)造函數(shù)

Cylinder*p;p=&c2;volume=p->Volume();area_surface=p->Area(area_bottom,area_side);cout<<"圓柱c2的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;return0;}2.2析構(gòu)函數(shù)格式:~類名()析構(gòu)函數(shù)是對(duì)象被注銷時(shí)自動(dòng)調(diào)用的一個(gè)成員函數(shù)析構(gòu)函數(shù)不帶參數(shù)常用來做清理變量、釋放內(nèi)存的工作例如,考慮圓柱類中加一個(gè)“名字”屬性,用字符指針記錄(動(dòng)態(tài)申請(qǐng)字符串)。當(dāng)對(duì)象被注銷時(shí)(例如程序退出),可以利用析構(gòu)函數(shù)來對(duì)該指針進(jìn)行清理例3-2中加入名字屬性和析構(gòu)函數(shù)。類的代碼修改為……classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

char*pName;Cylinder(){x=0;y=0;r=1;h=1;pName=newchar[10];strcpy_s(pName,8,"Noname");

}Cylinder(doublex0,doubley0,doubler0,doubleh0,

constchar*pGivenName){x=x0;y=y0;r=r0;h=r0;

intlength=strlen(pGivenName);pName=newchar[length+1];strcpy_s(pName,length+1,pGivenName);}~Cylinder()//析構(gòu)函數(shù){delete[]pName;cout<<“已清理pName”<<endl;}inlinedoubleVolume()……提示:黃色表示新增的代碼intmain()//主函數(shù){Cylinderc1;//自動(dòng)調(diào)用構(gòu)造函數(shù)

……cout<<"圓柱"<<c1.pName<<"的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;Cylinderc2(10,10,5,4,“CylinderC2”);//自動(dòng)調(diào)用帶參數(shù)的構(gòu)造函數(shù)

Cylinder*p;……area_surface=p->Area(area_bottom,area_side);cout<<"圓柱"<<p->pName<<"的體積為"<<volume<<",底面積為"<<area_bottom<<",表面積為"<<area_surface<<endl;return0;}作業(yè)1.設(shè)計(jì)一個(gè)矩形類(Rect),具有長(zhǎng)、寬屬性,類還具有求解并顯示矩形的周長(zhǎng)和面積的功能以及求兩個(gè)矩形面積和的功能(提示:實(shí)現(xiàn)該功能時(shí),用對(duì)象作參數(shù))。2.設(shè)計(jì)一個(gè)字符串類(MyString),除具有一般的輸入輸出字符串的功能外,還要求具有計(jì)算字符串長(zhǎng)度、連接兩個(gè)字符串等功能。上機(jī)時(shí)間*第3節(jié)常成員與靜態(tài)成員常數(shù)據(jù)成員常成員函數(shù)靜態(tài)數(shù)據(jù)成員靜態(tài)成員函數(shù)3.1常成員函數(shù)形式:

類型說明符函數(shù)名(參數(shù)表)const不修改對(duì)象數(shù)據(jù)成員的成員函數(shù)才能聲明為const函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)不能聲明為const例:繼續(xù)修改例3-2圓柱例子,加入一個(gè)打印參數(shù)的常成員函數(shù)……classCylinder{……//x、y、r、h、pName成員變量Cylinder(){......}//略

Cylinder(doublex0,......){......}//略

~Cylinder(){......}//略

inlinedoubleVolume(){......}//略

doubleArea(double&Sd,double&Sc){......}//略voidReportParmeter()const{cout<<"圓柱的坐標(biāo)為("<<x<<","<<y<<"),半徑為"<<r<<",高度為"<<h<<endl;}};intmain(){......//略cout<<"c1:";c1.ReportParmeter();volume=c1.Volume();area_surface=c1.Area(area_bottom,area_side);cout<<"圓柱c1的體積為"<<……;//略......//略cout<<"c2:";p->ReportParmeter();volume=p->Volume();area_surface=p->Area(area_bottom,area_side);cout<<"圓柱c2的體積為"<<……;//略return0;}提示:完整代碼參見課件程序例3-33.2常數(shù)據(jù)成員對(duì)不應(yīng)該被修改的數(shù)據(jù)成員聲明為const,可使其受到強(qiáng)制保護(hù),初始化方式與一般數(shù)據(jù)成員不同。只有常成員函數(shù)可以操作常對(duì)象例:繼續(xù)修改例3-2,把PI變成常數(shù)據(jù)成員……classCylinder{public:doublex,y;//底面圓心坐標(biāo)

doubler,h;//底面圓半徑,圓柱高

char*pName;constdoublePi;//將PI聲明為常數(shù)據(jù)成員Cylinder():Pi(3.1415926535)//初始化列表的方式進(jìn)行常數(shù)據(jù)成員初始化{……}Cylinder(doublex0,doubley0,doubler0,doubleh0,constchar*pGivenName):Pi(3.1415926535){……}……//后面自行把Area()和Volume()中的PI改成Pi提示:完整代碼參見課件程序例3-33.3靜態(tài)數(shù)據(jù)成員靜態(tài)成員的提出是為了解決數(shù)據(jù)共享的問題,它比全局變量在實(shí)現(xiàn)數(shù)據(jù)共享時(shí)更為安全,是實(shí)現(xiàn)同類多個(gè)對(duì)象數(shù)據(jù)共享的好方法。在類中,分為靜態(tài)數(shù)據(jù)成員和靜態(tài)函數(shù)。格式定義:static

數(shù)據(jù)類型變量名;初始化:數(shù)據(jù)類型類名::靜態(tài)數(shù)據(jù)成員=值是類的成員,被所有對(duì)象所共享,在內(nèi)存中只存貯一次定義或說明時(shí)前面加關(guān)鍵字static初始化在類外進(jìn)行,不加static和訪問權(quán)限修飾符例:繼續(xù)修改例3-2,增加一個(gè)統(tǒng)計(jì)當(dāng)前有多少個(gè)圓柱的成員變量。思路:不同對(duì)象之間(例如圓柱c1和c2之間)信息應(yīng)該相通,他們應(yīng)該共用一個(gè)統(tǒng)計(jì)變量。因此需要靜態(tài)數(shù)據(jù)成員classCylinder{……//省略x、y、r、h、pName變量

constdoublePi;staticintn;Cylinder():Pi(3.1415926535){……n++;//新聲明一個(gè)圓柱對(duì)象時(shí),統(tǒng)計(jì)數(shù)字加1}Cylinder(doublex0,……):Pi(3.1415926535){n++;//新聲明一個(gè)圓柱對(duì)象時(shí),統(tǒng)計(jì)數(shù)字加1}~Cylinder(){delete[]pName;//new出來的東西需要在程序結(jié)束前deleten--;//消除一個(gè)圓柱對(duì)象時(shí),統(tǒng)計(jì)數(shù)字減1cout<<"已清理pName。目前剩"<<n<<"個(gè)圓柱"<<endl;}……//Area()、Volume()函數(shù)不變,省略voidReportParmeter()const{cout<<"圓柱的坐標(biāo)為("<<x<<","<<y<<"),半徑為"<<r<<",高度為"<<h<<"。目前共有"<<n<<"個(gè)圓柱"<<endl; }};intCylinder::n=0;//注意靜態(tài)數(shù)據(jù)成員的初始化intmain(intargc,char*argv[])//主函數(shù){……//內(nèi)容不變,省略}3.4靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)是類的成員函數(shù),而非對(duì)象的成員。格式:static返回類型函數(shù)名(參數(shù)表)

調(diào)用形式:類名::靜態(tài)成員函數(shù)名(參數(shù)表)靜態(tài)成員函數(shù)中數(shù)據(jù)成員的引用也有區(qū)別:對(duì)靜態(tài)數(shù)據(jù)成員,直接引用對(duì)非靜態(tài)數(shù)據(jù)成員,通過對(duì)象引用例:繼續(xù)修改例3-2,增加一個(gè)顯示圓柱面積和體積計(jì)算公式的函數(shù)ShowFormula()思路:這些計(jì)算公式是通用知識(shí),無論程序中有沒有創(chuàng)建圓柱對(duì)象,這些知識(shí)都已經(jīng)存在,這個(gè)ShowFormula函數(shù)都應(yīng)能調(diào)用。因此,可考慮用靜態(tài)成員函數(shù)classCylinder{…...//前面省略staticvoidShowFormula(){cout<<"圓柱面積公式:A=2πr^2+2πrh;"<<endl<<"圓柱體積公式:V=πhr^2;"<<endl;}};……intmain(){

Cylinder::ShowFormula();//注意這時(shí)候還沒聲明圓柱對(duì)象

Cylinderc1;……//后面不變,省略}*第4節(jié)友元函數(shù)友元函數(shù)友元函數(shù)回顧:參見1.3節(jié)“訪問權(quán)限”。類外部的函數(shù)不可訪問類/對(duì)象的私有成員但C++提供了一種“友元函數(shù)”,可以在外部訪問類/對(duì)象的私有成員格式:

friend返回類型函數(shù)名(參數(shù)列表)例3-4友元函數(shù)示例#include<iostream>#include<math.h>classCpoint{private:intX,Y;public:Cpoint(intx,inty){X=x;Y=y;}voidprint();

frienddoubledist(Cpoint&a,Cpoint&b);};voidCpoint::print(){cout<<“X=“<<X<<“Y=“<<Y<<endl;}doubledist(Cpoint&a,Cpoint&b){intdx=a.X-b.X;//從外部訪問私有成員intdy=a.Y-b.Y;returnsqrt(dx*dx+dy*dy);}voidmain(){Cpointp1(3,4),p2(6,8);p1.print();p2.print();doubled=dist(p1,p2);//友元不是成員函數(shù)

//不需對(duì)象表示,直接調(diào)用cout<<"Distanceis"<<d<<endl;}友元函數(shù)聲明前不能加friend第5節(jié)繼承和派生繼承派生的概念繼承方式與訪問權(quán)限繼承派生中的構(gòu)造函數(shù)與析構(gòu)函數(shù)5.1繼承派生概念計(jì)算機(jī)系人員學(xué)生研究生本科生系主任行政管理人員教務(wù)教師教職工基類(父類)多繼承單繼承派生類(子類)在C++語言中,一個(gè)派生類(或稱子類)可以從一個(gè)基類(或稱父類)派生,也可以從多個(gè)基類派生。從一個(gè)基類派生的繼承稱為單繼承;從多個(gè)基類派生的繼承稱為多繼承。單繼承的定義格式:

class<派生類名>:<繼承方式><基類名>{<派生類新定義成員>};例3-5派生類示例#include<iostream>#include<string.h>usingnamespacestd;classCompuerPerson//計(jì)算機(jī)系人員類{private:charm_sNo[15];//學(xué)號(hào)工號(hào)。匈牙利命名法

charm_sName[10];//姓名

charm_cSex;//約定m代表男,f代表女

intm_nAge;//年齡public:

CompuerPerson(constchar*pNo,constchar*pName,charcSex,intnAge){strcpy_s(m_sNo,15,pNo);strcpy_s(m_sName,15,pName);m_cSex=cSex;m_nAge=nAge;}voidPrint(){cout<<m_sNo<<","<<m_sName<<","<<m_cSex<<","<<m_nAge<<"歲。";}};classCompStudent:publicCompuerPerson//計(jì)算機(jī)系學(xué)生類,從CompuerPerson繼承派生{private:intm_nClass;public:

CompStudent(constchar*pNo,constchar*pName,charcSex,intnAge,intnClass)

:CompuerPerson(pNo,pName,cSex,nAge)//先調(diào)用父類的構(gòu)造函數(shù){m_nClass=nClass;}

voidPrint(){

CompuerPerson::Print();//調(diào)用父類函數(shù)cout<<m_nClass<<"班。"<<endl;}};voidmain(){

CompStudentZs("30180007348","張三",'m',20,3);Zs.Print();}5.2繼承方式和訪問權(quán)限回顧:參見1.3節(jié)“訪問權(quán)限”。public和privatepublic:公有訪問權(quán)限,公有繼承方式

類成員為公有訪問權(quán)限時(shí),在類外部和子類中均可訪問private:私有訪問權(quán)限,私有繼承方式

類成員為私有訪問權(quán)限時(shí),在類外部和子類中均不可訪問protected:保護(hù)的訪問權(quán)限,保護(hù)的繼承方式類成員為保護(hù)訪問權(quán)限時(shí),在類外部不可訪問,在子類中可訪問類成員最終是何種訪問權(quán)限,由本類對(duì)該成員的訪問權(quán)限和對(duì)父類的繼承方式共同決定例3-6分析和檢驗(yàn)下列程序中的訪問權(quán)限,并回答問題#include<iostream>classA{public:voidf1(){};A(){k1=10;n1=11;}protected:intn1;private:intk1;};classB:publicA{public:voidf2(){};B(){k2=20;n2=21;}protected:intn2;private:intk2;};classC:publicB{public:voidf3(){};C(){k3=30;n3=31;}protected:intn3;private:intk3;};voidmain(){Aa;Bb;Cc;}(1)f2()能否訪問f1(),k1,n1?能訪問f1()、n1,不能訪問k1(2)main()中b能否訪問f1(),k1,n1?能訪問f1(),不能訪問k1和n1(3)f3()能否訪問f2()、k2和n2,以及f1(),k1和n1?f3能訪問f2()和n2,以及f1()和n1,但不能訪問k1和k2(4)c能否訪問f2(),k2和n2?以及f1(),k1和n1?能訪問f2()和f1(),其它的都不能訪問類的繼承訪問特性基類的訪問特性類的繼承方式子類的訪問特性外部訪問父子PublicProtectedPrivatePublicPublicProtectedNoaccess√√××××PublicProtectedPrivateProtectedProtectedProtectedNoaccess√×××××PublicProtectedPrivatePrivatePrivatePrivateNoaccess√×××××5.3構(gòu)造函數(shù)和析構(gòu)函數(shù)派生類的構(gòu)造函數(shù)除了對(duì)自己的數(shù)據(jù)成員初始化外,還負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)使基類的數(shù)據(jù)成員得以初始化,當(dāng)對(duì)象被刪除時(shí),派生類的析構(gòu)函數(shù)被執(zhí)行,同時(shí)基類的析構(gòu)函數(shù)也將被調(diào)用。格式:派生類名(派生類構(gòu)造函數(shù)總參數(shù)表):基類構(gòu)造函數(shù)(參數(shù)表1){<派生類中數(shù)據(jù)成員初始化>};e.g例2-5中:CompStudent(charsNo[],charsName[],charcSex,intnAge,intnClass)

:CompuerPerson(sNo,sName,cSex,nAge)基類中有缺省的構(gòu)造函數(shù)或沒定義構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)的定義中可省略對(duì)基類構(gòu)造函數(shù)的調(diào)用,而隱式調(diào)用缺省構(gòu)造函數(shù)?;悩?gòu)造函數(shù)中,只有有參數(shù)的構(gòu)造函數(shù),則派生類構(gòu)造函數(shù)中必須調(diào)用基類構(gòu)造函數(shù),提供將參數(shù)傳遞給基類構(gòu)造函數(shù)的途徑派生類構(gòu)造函數(shù)的調(diào)用順序?yàn)橄然?,后派生類。派生類析?gòu)函數(shù)的執(zhí)行順序?yàn)橄扰缮?,后基類。作業(yè)設(shè)計(jì)一個(gè)Person類,具有數(shù)據(jù)成員:姓名、年齡,其訪問權(quán)限為protected。再創(chuàng)建兩個(gè)類Student和Teacher,都是從Person類私有繼承過來的,其中Student類增加班級(jí)和學(xué)號(hào),Teacher類增加工號(hào)和教齡。分別輸入兩名學(xué)生和兩位教師的相應(yīng)信息,并在屏幕上輸出。第6節(jié)虛函數(shù)與多態(tài)性多態(tài)性運(yùn)算符重載虛函數(shù)純虛函數(shù)抽象類再說面向?qū)ο?.1多態(tài)性多態(tài)性:發(fā)出同樣的消息被不同類型的對(duì)象接收時(shí)導(dǎo)致完全不同的行為。包括:函數(shù)重載(已介紹過)運(yùn)算符重載基于虛函數(shù)的多態(tài)性6.2運(yùn)算符重載賦予已有的運(yùn)算符多重含義,通過重新定義運(yùn)算符使它能夠用于特定類的對(duì)象以完成特定的功能。例3-7重載“+”運(yùn)算,用以實(shí)現(xiàn)兩個(gè)字符串的連接#include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;classStr{private:char*s;intlen;public:Str(){}intmain(){charstr1[100],str2[100];gets_s(str1);gets_s(str2);Strs1(str1),s2(str2),s3;s3=s1+s2;s3.print();return0;}

Str(char*s1){len=(int)strlen(s1);s=newchar[len];strcpy_s(s,len+1,s1);}voidprint(){cout<<s<<endl;}Stroperator+(Strs1){strcat_s(s,len+s1.len+1,s1.s);returns;}};6.3虛函數(shù)格式

virtual

類型說明符函數(shù)名(參數(shù)表)虛函數(shù)是動(dòng)態(tài)聯(lián)編的基礎(chǔ),它是一種非static的成員函數(shù)編譯程序在編譯階段并不能確切知道將要調(diào)用的函數(shù),只有在程序運(yùn)行時(shí)才能確定將要調(diào)用的函數(shù),為此要確切知道該調(diào)用的函數(shù),要求聯(lián)編工作要在程序運(yùn)行時(shí)進(jìn)行,這種在程序運(yùn)行時(shí)進(jìn)行聯(lián)編工作被稱為動(dòng)態(tài)聯(lián)編。動(dòng)態(tài)聯(lián)編又稱動(dòng)態(tài)關(guān)聯(lián)。實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的條件?基類中有聲明的虛函數(shù)?調(diào)用虛函數(shù)操作的只能是對(duì)象指針或?qū)ο笠?,否則仍為靜態(tài)聯(lián)編例3-8虛函數(shù)示例#include<iostream>usingnamespacestd;classAnimal{public:voidcharacter(){cout<<"動(dòng)物特征:不同.\n";}

virtualvoidfood(){cout<<"動(dòng)物食物:不同.\n";}};classGiraffe:publicAnimal{public:voidcharacter(){cout<<"長(zhǎng)頸鹿特征:長(zhǎng)頸.\n";}

virtualvoidfood(){cout<<"長(zhǎng)頸鹿食物:樹葉.\n";}};classElephant:publicAnimal{public:voidcharacter(){cout<<"大象特征:長(zhǎng)鼻子.\n";}

virtualvoidfood(){cout<<"大象食物:草.\n";}};voidf1(Animal*a)//形式參數(shù)為基類指針{a->character();a->food();}voidf2(Animal&a)//形式參數(shù)為基類引用{a.character();a.food();}voidf3(Animala)//形式參數(shù)為基類對(duì)象{a.character();a.food();} voidmain(){Giraffeg;f1(&g);//實(shí)參為派生類對(duì)象的地址

//f2(g);//實(shí)參為派生類對(duì)象的引用

//f3(g);//實(shí)參為派生類對(duì)象

溫馨提示

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

評(píng)論

0/150

提交評(píng)論