老師課件描述總復(fù)習(xí)_第1頁(yè)
老師課件描述總復(fù)習(xí)_第2頁(yè)
老師課件描述總復(fù)習(xí)_第3頁(yè)
老師課件描述總復(fù)習(xí)_第4頁(yè)
老師課件描述總復(fù)習(xí)_第5頁(yè)
已閱讀5頁(yè),還剩93頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

面向?qū)ο蟪绦蛟O(shè)計(jì)(C++)總復(fù)習(xí)北京理工大學(xué)信息與電子學(xué)院白霞《面向?qū)ο蟪绦蛟O(shè)計(jì)》復(fù)習(xí)

從C到C++

類(lèi)和對(duì)象引用、友元和重載繼承與派生多態(tài)性與虛函數(shù)模板第一章從C到C++面向?qū)ο蟪绦蛟O(shè)計(jì)C++的初步知識(shí)面向?qū)ο蟮幕咎匦苑庋b性繼承性多態(tài)性數(shù)據(jù)與數(shù)據(jù)操作的代碼“包裝”起來(lái)創(chuàng)建具有另一個(gè)類(lèi)的屬性和行為的新類(lèi)的能力不同的對(duì)象收到相同的消息時(shí)產(chǎn)生不同的動(dòng)作數(shù)據(jù)隱藏代碼復(fù)用共享接口例題#.面向?qū)ο蟪绦蛟O(shè)計(jì)思想的主要特征中不包括

A.繼承性

B.功能分解,逐步求精

C.封裝性和信息隱藏

D.多態(tài)性B從C到C++函數(shù)原形說(shuō)明變量的說(shuō)明輸入輸出const說(shuō)明符void類(lèi)型函數(shù)原形說(shuō)明C++要求為函數(shù)提供完全的原型,包括所有參數(shù)的類(lèi)型和返回值類(lèi)型,格式如下:<數(shù)據(jù)類(lèi)型><函數(shù)名>(<形參列表>);函數(shù)原型聲明的兩種形式:直接使用函數(shù)定義的頭部,并且后面加個(gè)分號(hào)可省略形參名例題floatfun(inta,floatb,char*c);floatfun(int,float,char*);floatfun(inta,floatb,char*c)floatfun(int,float,char*)如下函數(shù)原型是否等價(jià)如下兩個(gè)函數(shù)的第一行是否等價(jià)原型只需知道數(shù)據(jù)類(lèi)型,參量名是可以選擇的。函數(shù)定義中必須包含參量名,這樣在函數(shù)體中才能對(duì)變量進(jìn)行操作。輸入輸出在C++中,輸入輸出操作時(shí)通過(guò)流來(lái)完成的。要利用C++流,利用以下頭文件iostream:使用cin,cout的預(yù)定義進(jìn)行針對(duì)標(biāo)準(zhǔn)設(shè)備的I/O操作,必須包含此頭文件fstream:使用文件流對(duì)象進(jìn)行針對(duì)磁盤(pán)文件的I/O操作,必須包含此頭文件iomanip:使用setw等大多數(shù)操作符,必須包含此頭文件#include<iostream>#include<fstream>#include<iomanip>usingnamespacestd;#include<iostream.h>#include<fstream.h>#include<iomanip.h>簡(jiǎn)單I/Ocout<<VisualC++datacin>>VisualC++datacout<<VisualC++datacin>>VisualC++data預(yù)定義的流對(duì)象標(biāo)準(zhǔn)輸出流標(biāo)準(zhǔn)輸入流與標(biāo)準(zhǔn)輸入設(shè)備鍵盤(pán)相關(guān)聯(lián)與標(biāo)準(zhǔn)輸出顯示器相關(guān)聯(lián)格式控制控制輸出寬度:setw控制填充字符:setfill控制對(duì)齊方式:setiosflags(ios::left)resetiosflags(ios::left)控制輸出精度:setprecision文件的I/O也是使用“流”頭文件<fstream.h>數(shù)據(jù)流對(duì)象需要自聲明關(guān)聯(lián)的文件也是自指定內(nèi)存

C++程序輸出文件數(shù)據(jù)流存儲(chǔ)設(shè)備輸入文件數(shù)據(jù)流BufferBuffer例題#.在控制格式I/O的操作中,設(shè)置域?qū)挼氖?/p>

A.setfillB.octC.setwD.setprecisionC例題#.下列有關(guān)C++流的描述中,錯(cuò)誤的是

A.C++操作符setw設(shè)置的輸出寬度永久有效

B.C++操作符endl可以實(shí)現(xiàn)輸出的回車(chē)換行

C.處理文件I/O,要包含頭文件fstreamD.使用操作符setw,要包含頭文件iomanipAconst說(shuō)明符代替#define宏定義常量定義常量數(shù)組const說(shuō)明符與函數(shù)參數(shù)相連接定義指針常量const定義簡(jiǎn)單常量const<類(lèi)型名><符號(hào)變量名>=<初值表達(dá)式>constintMAX=100;注意:聲明的時(shí)候初始化包含常量成員的類(lèi),其構(gòu)造函數(shù)必須采用初始化表的形式classA{constintMAX;public:A(intX):MAX(X){};};const定義常量數(shù)組constintMonDay[]={31,28,31,30,31,31,30,31,30,31}定義了一個(gè)整數(shù)類(lèi)型的常數(shù)數(shù)組。const說(shuō)明函數(shù)參數(shù)例:voidprint_value(constintvalue){cout<<value;}const說(shuō)明,不可改變定義指針常量:三種指針和const的組合指向常量的指針:一個(gè)指向常量的指針常指針:指針本身不能改變,它指向的值可以改變;指向常量的常指針:這個(gè)指針不能改變,它所指向的值也不能改變。例:intx=18;

constint*p1=&x;

int*constp2=&x;

constint*constp3=&x;*p1=20;可否?*p2=20;可否?p1=&y;可否?p2=&y;可否?*p3=20;可否?p3=&y;可否?第2章類(lèi)和對(duì)象從結(jié)構(gòu)到類(lèi)類(lèi)的成員函數(shù)構(gòu)造函數(shù)析構(gòu)函數(shù)動(dòng)態(tài)存儲(chǔ)類(lèi)的定義class

類(lèi)名{

private:

//私有類(lèi)型只限于通過(guò)自己的成員函數(shù)

//來(lái)訪問(wèn),即只有類(lèi)本身能夠訪問(wèn)它數(shù)據(jù)成員和成員函數(shù)說(shuō)明

public:

//公有類(lèi)型提供了類(lèi)的外部接口,允許類(lèi)

//的使用者來(lái)訪問(wèn)它數(shù)據(jù)成員和成員函數(shù)說(shuō)明

protected:

//保護(hù)類(lèi)型只允許本類(lèi)成員函數(shù)或派生

//類(lèi)成員函數(shù)訪問(wèn),用于類(lèi)的繼承和派生數(shù)據(jù)成員和成員函數(shù)};成員的缺省狀態(tài)是?數(shù)據(jù)成員的訪問(wèn)狀態(tài)通常是?一定是么?成員函數(shù)的訪問(wèn)狀態(tài)通常是?一定是么?成員函數(shù)定義的兩種方式是?數(shù)據(jù)成員的類(lèi)型一定是內(nèi)部類(lèi)型么?成員函數(shù)如何內(nèi)聯(lián)?缺省狀態(tài)是privateprivate,不一定public,不一定類(lèi)體內(nèi)和類(lèi)體外(注意作用域符::)也可是聲明過(guò)的另一個(gè)類(lèi)類(lèi)體內(nèi),隱式;類(lèi)體外,inlineclassClock{

private:intHour,Minute,Second;

public:

voidSetTime(intNewH,intNewM,intNewS);};voidClock::SetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}對(duì)象的定義

一般對(duì)象:引用對(duì)象:指針對(duì)象:

Clocka;Clock&r=a;Clock*p=&a;a.SetTime(0,0,0)r.SetTime(0,0,0)p->SetTime(0,0,0)(*p).SetTime(0,0,0)對(duì)象的存儲(chǔ)C++規(guī)定:對(duì)象占用的存儲(chǔ)空間只是對(duì)象數(shù)據(jù)成員占用的存儲(chǔ)空間,可用sizeof驗(yàn)證不同對(duì)象使用同一段函數(shù)代碼,它們?nèi)绾螌?duì)不同對(duì)象中的數(shù)據(jù)進(jìn)行操作呢?隱式指針thisthis指針永遠(yuǎn)指向當(dāng)前對(duì)象構(gòu)造函數(shù)特殊的成員函數(shù):名同類(lèi)名、無(wú)返回類(lèi)型(void也不行)可以無(wú)參,可以有參,可以有缺省參數(shù),可以重載(一個(gè)類(lèi)沒(méi)有定義任何構(gòu)造函數(shù)則編譯系統(tǒng)自動(dòng)為該類(lèi)建立缺省構(gòu)造函數(shù))自動(dòng)調(diào)用(當(dāng)定義一個(gè)對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù),為該對(duì)象分配內(nèi)存空間,并以對(duì)象名為該空間命名)注意缺省形參值的說(shuō)明次序:必須從右向左順序聲明,并且在缺省形參值的右面不能有非缺省形參值的參數(shù)。例題#.下列函數(shù)原型聲明中錯(cuò)誤的是

A.voidFun(intx=0,inty=0);B.voidFun(intx,inty);C.voidFun(intx,inty=0);D.voidFun(intx=0,inty);D析構(gòu)函數(shù)特殊的成員函數(shù):名同類(lèi)名,且求反~、無(wú)返回類(lèi)型(void也不行)沒(méi)有參數(shù),不能重載,一個(gè)類(lèi)只有一個(gè)析構(gòu)函數(shù)(一個(gè)類(lèi)沒(méi)有定義析構(gòu)函數(shù)則編譯系統(tǒng)自動(dòng)為該類(lèi)建立缺省析構(gòu)函數(shù))自動(dòng)調(diào)用(對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù),釋放所占的內(nèi)存空間)拷貝構(gòu)造函數(shù)特殊的構(gòu)造函數(shù):名同類(lèi)名、無(wú)返回類(lèi)型參數(shù):本類(lèi)對(duì)象的引用調(diào)用用類(lèi)的已知對(duì)象定義該類(lèi)的一個(gè)正在被創(chuàng)建的對(duì)象對(duì)象作為函數(shù)的實(shí)參傳遞給函數(shù)形參對(duì)象作為函數(shù)返回值類(lèi)名::類(lèi)名(類(lèi)名&對(duì)象名)#include<iostream.h>classClock{

intHour,Minute,Second;public:Clock(inth=0,intm=0,ints=0):Hour(h),Minute(m),Second(s){cout<<1;}Clock(Clock&obj):Hour(obj.Hour),Minute(obj.Minute),Second(obj.Second){cout<<2;}~Clock(){cout<<0;}};voidmain(){Clockobj1(1),obj2(2),obj3(obj1);}輸出結(jié)果是112000例題下列情況中,不會(huì)調(diào)用拷貝構(gòu)造函數(shù)的是A.用一個(gè)對(duì)象去初始化同一類(lèi)的另一個(gè)新對(duì)象時(shí)B.將類(lèi)的一個(gè)對(duì)象賦予該類(lèi)的另一個(gè)對(duì)象時(shí)C.函數(shù)的形參是類(lèi)的對(duì)象,調(diào)用函數(shù)進(jìn)行形參和實(shí)參結(jié)合時(shí)D.函數(shù)的返回值時(shí)類(lèi)的對(duì)象,函數(shù)執(zhí)行返回調(diào)用時(shí)B動(dòng)態(tài)內(nèi)存分配使用操作符new和delete必須使用指針,沒(méi)有指針就不可能讀取堆釋放數(shù)組加[]new和構(gòu)造函數(shù)在一起delete和析構(gòu)函數(shù)在一起第3章引用、友元和重載引用(reference)友元(friend)重載(overloading)引用格式:<類(lèi)型>&<引用名>=<變量名>規(guī)則:引用在定義時(shí)必須初始化引用一旦初始化后不得再作為其他變量的別名從一而終函數(shù)通信中的引用引用傳遞值傳遞:調(diào)用函數(shù)的參數(shù)在接收函數(shù)中保持不變,這是局部變量的性質(zhì)決定的。地址傳遞:接收函數(shù)改變了傳遞給它的參數(shù),但語(yǔ)法麻煩(間接引用符號(hào))引用傳遞:效果同地址傳遞效果一樣,但語(yǔ)法更簡(jiǎn)潔方便const&和值傳遞的不同按值傳遞的局部拷貝需要一定運(yùn)行時(shí)間,引用傳遞更有效率函數(shù)通信中的引用(續(xù))返回引用可以出現(xiàn)在運(yùn)算符的左邊注意不要返回內(nèi)部變量

int&max(int&x,int&y);max(a,b)=0;//將a、b中較大的值改變?yōu)?

int&max(intx,inty);max(a,b)=0;//自動(dòng)釋放友元將外界的某個(gè)對(duì)象說(shuō)明為某一個(gè)類(lèi)的友元,這個(gè)外界對(duì)象就可以訪問(wèn)這個(gè)類(lèi)對(duì)象中的私有成員。聲明為友元的外界對(duì)象既可以是另一個(gè)類(lèi)的成員函數(shù),也可以是不屬于任何類(lèi)的一般的函數(shù),還可以是整個(gè)的一個(gè)類(lèi)友元聲明包含在其私有成員可被訪問(wèn)的類(lèi)的定義中。此聲明可放在公有部分,也可放在私有部分。定義時(shí)在函數(shù)或者類(lèi)聲明之前加關(guān)鍵詞friend友元提供了一扇通向私有數(shù)據(jù)的后門(mén)classClock{

intHour,Minute,Second;public:Clock(inth,intm,ints):Hour(h),Minute(m),Second(s){}

};voidDisplay(Clockobj){cout<<obj.Hour<<‘:’<<obj.Minute<<‘:’<<obj.Second<<endl;}friend

voidDisplay(Clockobj);classA{public:voidDisplay(Clockobj){cout<<obj.Hour<<‘:’<<obj.Minute<<‘:’<<obj.Second<<endl;}};friend

voidA::Display(Clockobj);classA;friend

classA;友元的特性不對(duì)稱:如果A是B的友元,但B不一定是A的友元;不傳遞:友元關(guān)系不能傳遞,如果A是B的友元,B是C的友元,但A不一定是C的友元;不繼承:基類(lèi)的友元并不能由其派生類(lèi)繼承。例題#.一個(gè)類(lèi)的友元函數(shù)能夠訪問(wèn)該類(lèi)的

A.私有成員

B.公有成員

C.保護(hù)成員

D.所有成員D重載函數(shù)重載普通函數(shù)重載成員函數(shù)重載構(gòu)造函數(shù)重載運(yùn)算符重載使用友元函數(shù)重載使用成員函數(shù)重載函數(shù)重載函數(shù)重載:同一個(gè)函數(shù)名對(duì)應(yīng)多個(gè)函數(shù)的實(shí)現(xiàn)重載規(guī)則:參數(shù)個(gè)數(shù)或者類(lèi)型不同需要注意:intadd(intx,inty);voidadd(intx,inty);編譯器不以返回值來(lái)區(qū)分intadd(intx,inty);intadd(inta,intb);編譯器不以形參名來(lái)區(qū)分例題#.下列關(guān)于函數(shù)重載的敘述中,錯(cuò)誤的是

A.函數(shù)重載就是用相同的函數(shù)名定義多個(gè)函數(shù)

B.函數(shù)重載的參數(shù)列表必須不同

C.函數(shù)重載的返回值類(lèi)型必須不同

D.函數(shù)重載的參數(shù)可以帶有默認(rèn)值C運(yùn)算符重載規(guī)則和限制除了少數(shù)幾個(gè)之外,C++的運(yùn)算符全部可以重載只能重載C++語(yǔ)言中已有的運(yùn)算符,不可臆造新的不改變?cè)\(yùn)算符的優(yōu)先級(jí)和結(jié)合性不能改變操作數(shù)個(gè)數(shù)經(jīng)重載的運(yùn)算符,其操作數(shù)中至少應(yīng)該有一個(gè)是自定義類(lèi)型operator<運(yùn)算符>使用友元函數(shù)重載運(yùn)算符參數(shù)個(gè)數(shù)=原操作數(shù)個(gè)數(shù)至少應(yīng)該有一個(gè)自定義類(lèi)型的形參輸入輸出運(yùn)算符的重載使用友元函數(shù)friendcomplexoperator+(complexc1,complexc2){returncomplex(c1.real+c2.real,c1.imag+c2.imag);}p2;comp=operator+(comp1,comp2);使用成員函數(shù)重載運(yùn)算符參數(shù)個(gè)數(shù)=原操作數(shù)個(gè)數(shù)-1(后置++/--除外)自加自減符的重載使用成員函數(shù)賦值運(yùn)算符的重載使用成員函數(shù)下標(biāo)運(yùn)算符的重載使用成員函數(shù)complexoperator+(complexc2){returncomplex(real+c2.real,imag+c2.imag);}p2;comp=comp1.operator+(comp2);數(shù)學(xué)運(yùn)算符:+-*/單目運(yùn)算符:++--賦值運(yùn)算符:=輸入輸出符:>><<基本模式前置和后置的區(qū)分:int表示后置何時(shí)需要重載?類(lèi)包含指針成員記住外殼有用的外殼重載<<和重載>>ostream&operator<<(ostream&out,yourClass&object){//函數(shù)體

returnout;}istream&operator>>(istream&in,yourClass&object){//函數(shù)體

returnin;}三法則如果類(lèi)需要自定義的析構(gòu)函數(shù)、自定義的拷貝構(gòu)造函數(shù)和重載賦值操作符中的任何一個(gè),那么也就需要另外的兩個(gè),這個(gè)規(guī)則常稱為三法則(ruleofthree)“指針懸掛問(wèn)題”haha\0xixi\0str1str2m_pDatam_pDatam_pDatastr3haha\0haha\0xixi\0str1str2m_pDatam_pDatam_pDatastr3haha\0第4章繼承與派生合成與繼承單繼承多繼承繼承與派生的概念繼承的實(shí)質(zhì)就是建造新的派生類(lèi)基類(lèi)派生類(lèi)基類(lèi)基類(lèi)派生類(lèi)派生類(lèi)的定義class<派生類(lèi)名>:<繼承方式1><基類(lèi)名1>,<繼承方式2><基類(lèi)名2>,…<繼承方式n><基類(lèi)名n>{

<派生類(lèi)新定義成員>};繼承方式:private、public或者protected派生類(lèi)的構(gòu)成吸收基類(lèi)成員(除構(gòu)造函數(shù)和析構(gòu)函數(shù)外,新類(lèi)將基類(lèi)的成員全部接受)添加新的成員,包括數(shù)據(jù)和函數(shù)(例如構(gòu)造函數(shù)和析構(gòu)函數(shù))改造基類(lèi)成員(在新類(lèi)中定義與基類(lèi)中同名的數(shù)據(jù)或函數(shù))派生類(lèi)對(duì)基類(lèi)成員的訪問(wèn)繼承方式基類(lèi)成員在派生類(lèi)中的訪問(wèn)屬性派生類(lèi)中的成員函數(shù)派生類(lèi)的對(duì)象公有繼承publicpublicprotectedprivatepublicprotectedprivate*可訪問(wèn)可訪問(wèn)不可訪問(wèn)可訪問(wèn)不可訪問(wèn)不可訪問(wèn)私有繼承privatepublicprotectedprivateprivateprivateprivate*可訪問(wèn)可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)保護(hù)繼承protectedpublicprotectedprivateprotectedprotectedprivate*可訪問(wèn)可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)例題#.下列關(guān)于繼承與派生的敘述中,錯(cuò)誤的是

A.派生類(lèi)具有基類(lèi)的特征,也具有自己特有的特征

B.派生類(lèi)能繼承基類(lèi)的所有成員變量

C.派生類(lèi)只能繼承基類(lèi)的公有成員,不能繼承私有成員

D.派生類(lèi)不能繼承基類(lèi)的構(gòu)造函數(shù)和析構(gòu)函數(shù)C例題#.若要用派生類(lèi)的對(duì)象訪問(wèn)基類(lèi)的保護(hù)成員,正確的是

A.公有繼承

B.私有繼承

C.保護(hù)繼承

D.不可實(shí)現(xiàn)D例題設(shè)有以下類(lèi)的定義classA{inta1;protected:inta2;public:inta3;}classB:protectedA{intb1;protected:intb2;public:intb3;}classc:privateB{intc1;protected:intc2;public:intc3;}請(qǐng)按訪問(wèn)權(quán)限寫(xiě)出派生類(lèi)C中具有的成員:私有成員:保護(hù)成員:公有成員:a2a3b2b3c1c2c3派生類(lèi)構(gòu)造函數(shù)的定義派生類(lèi)名::派生類(lèi)名(總參數(shù)表):基類(lèi)名(參數(shù)表),子對(duì)象名(參數(shù)表){

本類(lèi)新增非對(duì)象成員初始化賦值語(yǔ)句;};基類(lèi)名、子對(duì)象名之間的次序可以任意派生類(lèi)構(gòu)造函數(shù)的執(zhí)行順序先長(zhǎng)輩,調(diào)用基類(lèi)構(gòu)造函數(shù)長(zhǎng)輩(基類(lèi)):調(diào)用順序按照它們被繼承時(shí)說(shuō)明的順序(從左向右)再客人,調(diào)用子對(duì)象的構(gòu)造函數(shù)客人(成員對(duì)象):調(diào)用順序按照它們?cè)陬?lèi)中說(shuō)明的順序(從上到下)后自己,執(zhí)行派生類(lèi)構(gòu)造函數(shù)體中的內(nèi)容注意:未列出則表示調(diào)用缺省構(gòu)造函數(shù)析構(gòu)函數(shù)的執(zhí)行順序呢?多繼承引起的問(wèn)題多繼承可能造成對(duì)基類(lèi)中某個(gè)成員訪問(wèn)出現(xiàn)了不唯一,稱為對(duì)基類(lèi)成員訪問(wèn)的二義性問(wèn)題。產(chǎn)生的情況有兩種:如果一個(gè)類(lèi)從多個(gè)基類(lèi)派生,而這些基類(lèi)包括同名變量或函數(shù)如果一個(gè)類(lèi)從多個(gè)基類(lèi)派生,而這些基類(lèi)又有共同的基類(lèi)虛基類(lèi)虛基類(lèi)的引入用于有共同基類(lèi)的場(chǎng)合聲明以virtual修飾說(shuō)明基類(lèi)作用主要用來(lái)解決多繼承時(shí)可能發(fā)生的對(duì)同一基類(lèi)繼承多次而產(chǎn)生的二義性問(wèn)題.為最遠(yuǎn)的派生類(lèi)提供唯一的基類(lèi)成員,而不重復(fù)產(chǎn)生多次拷貝AB1B2CclassB1:virtual

publicAclassB2:virtual

publicAclassA{intb;};classB1:vitual

publicA{intb1;};classB2:vitualpublicA{intb2;};classC:publicB1,publicB2{intc;};b1b2cB1類(lèi)成員B2類(lèi)成員C類(lèi)對(duì)象bA類(lèi)成員虛基類(lèi)及其派生類(lèi)構(gòu)造函數(shù)在整個(gè)繼承結(jié)構(gòu)中,直接或間接繼承虛基類(lèi)的所有派生類(lèi),都必須在構(gòu)造函數(shù)的成員初始化表中給出對(duì)虛基類(lèi)的構(gòu)造函數(shù)的調(diào)用。(如果未列出,則表示調(diào)用該虛基類(lèi)的缺省構(gòu)造函數(shù)。)在建立對(duì)象時(shí)指定的類(lèi)稱為最遠(yuǎn)派生類(lèi),它的構(gòu)造函數(shù)調(diào)用虛基類(lèi)的構(gòu)造函數(shù),該派生類(lèi)的其它基類(lèi)對(duì)虛基類(lèi)構(gòu)造函數(shù)的調(diào)用被忽略。聲明虛基類(lèi)的派生類(lèi)構(gòu)造函數(shù)調(diào)用規(guī)則:虛基類(lèi)的構(gòu)造函數(shù)在非虛基類(lèi)之前調(diào)用;若同一層次中包含多個(gè)虛基類(lèi),這些虛基類(lèi)的構(gòu)造函數(shù)按它們說(shuō)明的次序調(diào)用;若虛基類(lèi)由非虛基類(lèi)派生而來(lái),則仍然先調(diào)用基類(lèi)的構(gòu)造函數(shù),再調(diào)用派生類(lèi)的構(gòu)造函數(shù)。BaseBase1Base2Derived(虛的)(虛的)第5章多態(tài)性與虛函數(shù)繼承呼喚多態(tài)虛函數(shù)純虛函數(shù)與抽象類(lèi)引入派生類(lèi)后的對(duì)象指針引入派生概念后,任何被說(shuō)明為指向基類(lèi)對(duì)象的指針都可以指向它的公有派生類(lèi)的對(duì)象不能將一個(gè)聲明為指向派生類(lèi)對(duì)象的指針指向其基類(lèi)的一個(gè)對(duì)象。虛函數(shù)的定義虛函數(shù)的定義在基類(lèi)中進(jìn)行,它在基類(lèi)中需要定義為虛函數(shù)的成員函數(shù)的聲明中冠以關(guān)鍵詞virtual。virtual說(shuō)明函數(shù)的原型,不必用在函數(shù)實(shí)現(xiàn)時(shí)具有繼承性,基類(lèi)中聲明了虛函數(shù),派生類(lèi)中無(wú)論是否說(shuō)明,同原型函數(shù)都自動(dòng)為虛函數(shù)重新定義時(shí),函數(shù)原形,包括返回類(lèi)型、函數(shù)名、參數(shù)個(gè)數(shù)、參數(shù)類(lèi)型的順序,必須與基類(lèi)中的原型完全一致。判斷題聲明了某個(gè)成員函數(shù)為虛函數(shù),在該類(lèi)中不能出現(xiàn)與這個(gè)成員函數(shù)同名且返回值和參數(shù)個(gè)數(shù)、類(lèi)型都相同的非虛函數(shù)。虛函數(shù)使用注意在同一個(gè)類(lèi)家族中,希望一個(gè)指針能指向不同的類(lèi),那么把它定義為指向基類(lèi)定義基類(lèi)的析構(gòu)函數(shù)為虛函數(shù),可以保證派生類(lèi)被正確析構(gòu)構(gòu)造函數(shù)不能定義為虛函數(shù)內(nèi)聯(lián)函數(shù)不能定義為虛函數(shù)虛函數(shù)的效率使用虛擬函數(shù)的確比普通函數(shù)調(diào)用效率要低使用間接的函數(shù)調(diào)用表方法(虛擬函數(shù)地址表vtable)。實(shí)現(xiàn)了多態(tài)!派生類(lèi)虛函數(shù)調(diào)用基類(lèi)版本時(shí),必須顯示使用作用域操作符。如果派生類(lèi)函數(shù)忽略了這樣做,則函數(shù)調(diào)用會(huì)在運(yùn)行時(shí)確定并且將是一個(gè)自身調(diào)用,從而導(dǎo)致無(wú)窮遞歸。純虛函數(shù)如果基類(lèi)的虛函數(shù)中沒(méi)有任何代碼,那么這個(gè)虛函數(shù)稱作“純虛函數(shù)”

virtualtype函數(shù)名(參數(shù)表)=0;只有接口,沒(méi)有實(shí)現(xiàn)抽象類(lèi)若一個(gè)類(lèi)中至少有一個(gè)純虛函數(shù),那么就稱該類(lèi)為抽象類(lèi)。對(duì)抽象類(lèi)的使用有幾點(diǎn)規(guī)定:抽象類(lèi)只能用作其它類(lèi)的基類(lèi),不能建立抽象類(lèi)對(duì)象。抽象類(lèi)不能用作參數(shù)類(lèi)型、函數(shù)返回類(lèi)型可以聲明指向抽象類(lèi)的指針和引用,此指針和引用可以指向它的派生類(lèi),進(jìn)而實(shí)現(xiàn)多態(tài)性。classShape//定義基類(lèi){public:virtualfloatarea()=0;//定義純虛函數(shù)

virtualvoidDisp()=0;//定義純虛函數(shù)};classRectangle:publicShape//定義圖形的派生類(lèi)矩形類(lèi){public:floatarea();//可以定義

voidDisp();//可以定義};判斷題純虛函數(shù)的目的是實(shí)現(xiàn)類(lèi)的某個(gè)具體功能純虛函數(shù)可以被調(diào)用如果派生類(lèi)沒(méi)有實(shí)現(xiàn)基類(lèi)的所有純虛函數(shù),那么派生類(lèi)也是抽象類(lèi)抽象類(lèi)的成員函數(shù)一定是純虛函數(shù)抽象類(lèi)可以建立對(duì)象第6章模板模板的概念函數(shù)模板類(lèi)模板模板的概念模板:是實(shí)現(xiàn)代碼重用機(jī)制的一種工具,它可以實(shí)現(xiàn)類(lèi)型參數(shù)化,即把類(lèi)型定義為參數(shù)。模板分類(lèi):函數(shù)模板(functiontemplate)類(lèi)模板(classtemplate)函數(shù)模板函數(shù)模板的一般說(shuō)明形式如下:template<模板形參表><返回值類(lèi)型><函數(shù)名>(形參表){ //函數(shù)定義體}可以在任何使用類(lèi)型名字的地方使用該類(lèi)型形參類(lèi)模板類(lèi)模板的一般說(shuō)明形式如下:template

<模板形參表>class

類(lèi)名{ //類(lèi)定義體};可以在任何使用類(lèi)型名字的地方使用該類(lèi)型形參模板形參表一個(gè)或者多個(gè)模板形參模板形參是表示類(lèi)型的類(lèi)型形參,類(lèi)型形參跟在關(guān)鍵字class或typename之后定義模板形參表的說(shuō)明模板形參表不能為空將模板類(lèi)型形參命名為T(mén),也可以命名為其它任意名字模板形參作用域:模板形參的名字可以在聲明為模板形參之后直到模板聲明或者定義的末尾處使用使用模板形參名字的限制:作用模板形參的名在不能再模板內(nèi)部重用模板形參表的說(shuō)明(續(xù))如果類(lèi)型形參多于一個(gè),則每個(gè)類(lèi)型形參都要使用class或typenameT對(duì)應(yīng)的實(shí)際類(lèi)型,可以是基本數(shù)據(jù),也可以是類(lèi)類(lèi)型在函數(shù)模板形參表中,class和

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論