第1章-C++面向?qū)ο蟪绦虻脑O(shè)計要點-課件_第1頁
第1章-C++面向?qū)ο蟪绦虻脑O(shè)計要點-課件_第2頁
第1章-C++面向?qū)ο蟪绦虻脑O(shè)計要點-課件_第3頁
第1章-C++面向?qū)ο蟪绦虻脑O(shè)計要點-課件_第4頁
第1章-C++面向?qū)ο蟪绦虻脑O(shè)計要點-課件_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第1章 C+面向?qū)ο蟪绦蛟O(shè)計要點 1.1 函數(shù)和函數(shù)參數(shù) 1.2 輸入輸出 1.3 類1.4 抽象類型和模板第1章 C+面向?qū)ο蟪绦蛟O(shè)計要點 1.1 函數(shù)和函數(shù)參1.1 函數(shù)和函數(shù)參數(shù) 1.1.1函數(shù)類型 C+中有兩種類型函數(shù):常規(guī)函數(shù)和成員函數(shù)。常規(guī)函數(shù)用于完成一個特定的功能,成員函數(shù)用于類方法的定義。無論是常規(guī)函數(shù)還是成員函數(shù),其定義都包括四個部分:函數(shù)名、形式參數(shù)表、返回類型和函數(shù)體。 1.1 函數(shù)和函數(shù)參數(shù) 1.1.1函數(shù)類型 函數(shù)的使用者通過函數(shù)名來調(diào)用函數(shù),調(diào)用過程是把實際參數(shù)表傳送給形式參數(shù)表作為函數(shù)的數(shù)據(jù)來源,然后執(zhí)行函數(shù)體中的語句實現(xiàn)該函數(shù)的功能,最后得到的返回值由函數(shù)名帶回

2、函數(shù)的調(diào)用者。成員函數(shù)是用于類方法定義的,因此,只有該類的對象才能調(diào)用其成員函數(shù)。 函數(shù)的使用者通過函數(shù)名來調(diào)用函數(shù),調(diào) 1.1.2 函數(shù)名重載 C+允許函數(shù)名重載,即允許若干個相同的函數(shù)名能在相同作用域內(nèi)使用。編譯系統(tǒng)根據(jù)函數(shù)引用的參數(shù)類型和參數(shù)個數(shù)判明函數(shù)的使用。 例11函數(shù)名重載 include int max(int a,int b) if(a=b)return a; else return b; 1.1.2 函數(shù)名重載Float max(float a,float b,float c) if(a=b&a=c)return a; else if(ac)return b;else ret

3、urn c;void main() printf(max(2,3)=%dn,max(2,3); printf(max(2.3,5.6,3.1)=%fn,max(2.3,5.6,3.1); Float max(float a,float b,floa 1.1.3 函數(shù)參數(shù) C+中函數(shù)(包括常規(guī)函數(shù)和成員函數(shù))參數(shù)有四種方式:值參數(shù)、常值參數(shù)、引用參數(shù)和常值引用參數(shù)等方式。但常值參數(shù)方式因無必要,一般不用。要注意的是,不同方式的參數(shù)(不同方式的返回值也類同)在函數(shù)的傳遞調(diào)用中系統(tǒng)將視為不同的數(shù)據(jù)類型,如定義有函數(shù)f1(intx), 1.1.3 函數(shù)參數(shù) 在函數(shù)f1()中又要調(diào)用函數(shù)f2(),如果函

4、數(shù)f2()的定義是f2(constintx),系統(tǒng)將視int和constint為不同的數(shù)據(jù)類型,從而告知用戶數(shù)據(jù)類型不匹配。int和int&的情況也一樣。注意到這一點將可免去許多程序調(diào)試中的問題。 例12函數(shù)參數(shù)的值參數(shù)、引用參數(shù)和常值引用參數(shù)三種方式。 int Example1(int a,int b,int c) /值參數(shù)方式 intx,y,z; x=a;y=b;z=c; 在函數(shù)f1()中又要調(diào)用函數(shù)f2( a=2*a;b=2*b;c=2*c; /函數(shù)返回后對應(yīng)實際參數(shù)的值不變 return(x+y+z)/3; intExample2(int& a,int& b,int& c)/引用參數(shù)方

5、式 int x,y,z; x=a;y=b;z=c; a=2*a;b=2*b;c=2*c;/函數(shù)返回后對應(yīng)實際參數(shù)的值改變 return(x+y+z)/3; a=2*a;b=2*b;c=2* intExample3(const int& a,const int& b,cons tint&c) /常值引用參數(shù)方式 return(a+b+c)/3; /不允許改變常值引用參數(shù)a,b,c的值 intExample3(const int& a 引用參數(shù)的方法是在類型名后加符號&,常值引用參數(shù)的方法是在引用參數(shù)方法的基礎(chǔ)上再在函數(shù)定義行的最前邊加保留字const。 對于Example1的值參數(shù)方式,在運行時

6、,對應(yīng)的實際參數(shù)的值拷貝給形式參數(shù),當(dāng)函數(shù)終止時,形式參數(shù)的值不拷貝回實際參數(shù)。因此,值參數(shù)方式的函數(shù)調(diào)用不會改變對應(yīng)形式參數(shù)的實際參數(shù)的值。 引用參數(shù)的方法是在類型名后加符號& 1.1.4成員函數(shù)返回值 和函數(shù)參數(shù)的方式類同,成員函數(shù)返回值也有值方式、常值方式、引用方式和常值引用方式等四種方式。 當(dāng)成員函數(shù)的返回值為值方式時,允許改變該對象的私有成員數(shù)據(jù)。注意,成員函數(shù)的返回值為無const標(biāo)識符的任何數(shù)據(jù)類型(包括void類型)時即為值方式。 1.1.4成員函數(shù)返回值例13成員函數(shù)返回值的值方式和常值方式includeclass Temperature private: float hig

7、h Temp /最高溫度 float low Temp; /最低溫度例13成員函數(shù)返回值的值方式和常值方式public: Temperature(float h,float l)high Temp=h;lowTemp=l; void Update Temp(float temp);/成員函數(shù)返回值為值方式 float GetHigh Temp(void)const;/成員函數(shù)返回值為常值方式 float GetLowTemp(void)const;/成員函數(shù)返回值為常值方式 ; void Temperature:Update Temp(float temp) public: if(temphi

8、ghTemp)highTemp=temp;/允許更改私有數(shù)據(jù) if(temphighTemp)high 1.2 輸入輸出 C+提供了一個層次結(jié)構(gòu)的I/O流類來支持輸入輸出。I/O流類的類層次結(jié)構(gòu)關(guān)系如圖11所示。流是一個非常形象的術(shù)語,每一個流類指定了一類文件和這類文件數(shù)據(jù)流動的方向。當(dāng)我們定義一個具體的流類對象時,就確切地指定了這個文件的存儲區(qū)和由系統(tǒng)設(shè)定的內(nèi)存緩沖區(qū),以及這個文件在其存儲區(qū)和內(nèi)存緩沖區(qū)之間的數(shù)據(jù)流動方向。 1.2 輸入輸出 C+ ios類是基類,它提供了格式、狀態(tài)信息和錯誤檢測。類ios中沒有定義實際的輸入和輸出操作。實際操作是由派生類istream、ostream等提供的

9、。兩種基本的輸入輸出方式是:鍵盤屏幕(默認(rèn))輸入輸出和文件輸入輸出。 ios類是基類,它提供了格式、狀態(tài)圖11 I/O流類的類層次 圖11 I/O流類的類層次 1.2.1 鍵盤屏幕輸入輸出 iostream流類中定義了鍵盤輸入類、屏幕輸出類和錯誤信息輸出類。當(dāng)iostream流類包含在應(yīng)用程序中時,cin、cout和cerr分別為鍵盤輸入類、屏幕輸出類和錯誤信息輸出類的系統(tǒng)默認(rèn)對象。cin對象鍵盤輸入的操作符為,cout和cerr對象屏幕輸出的操作符為。 1.2.1 鍵盤屏幕輸入輸出include void main(void) char c; int n; coutn; coutn=nend

10、l;include 1.2.2文件輸入輸出 調(diào)用打開文件函數(shù)時,打開文件函數(shù)的參數(shù)包括文件名和數(shù)據(jù)流動的方向,打開文件函數(shù)返回文件的開始地址。系統(tǒng)在存儲文件時,在其末尾添加有文件結(jié)束標(biāo)記,這樣打開文件函數(shù)就具體地指定了一個文件在內(nèi)存中的起始位置、結(jié)束位置和數(shù)據(jù)流動的方向。 fstream.h流類中定義了文件輸入類和文件輸出類。文件輸入類的類名為ifstream,文件輸出類的類名為ofstream。 1.2.2文件輸入輸出includeincludeinclude /包含exit()函數(shù)Void main(void) ifstream fin; /定義fin為ifstream 類的對象 ofst

11、ream fout; /定義fout為ofstream類的對象 fout.open(exam.dat,ios:out);/建立輸出文件exam.datinclude /輸出字符串wang和數(shù)字50到輸出文件exam.dat中(可打開該文件查看)char name=wang,name210;int age=50,age2;foutnameendl;foutageendl;fin.open(exam.dat,ios:in|ios:nocreate);/打開輸入文件exam.datif (!fin) /輸出字符串wang和數(shù)字50到輸出文件exam cerr不能打開文件exam.datname2ca

12、ge2;/屏幕輸出查看coutname2=name2endl;coutage2=ageendl; cerr不能打開文件exam.dat1.3 類 當(dāng)開發(fā)的應(yīng)用程序的數(shù)據(jù)類型不是int、float、char等系統(tǒng)支持的基本數(shù)據(jù)類型時,開發(fā)者就需定義自己的數(shù)據(jù)類型。C+中定義自己的數(shù)據(jù)類型的面向?qū)ο蠓椒ㄊ鞘褂妙悺?類是C+支持面向?qū)ο蟪绦蛟O(shè)計的基礎(chǔ)。C+中定義類使用標(biāo)識符class,類定義包括類中數(shù)據(jù)的定義和成員函數(shù)的定義。1.3 類 當(dāng)開發(fā)的應(yīng)用 例14設(shè)計一個人民幣類,其方法包括設(shè)置、加(+)、加等于(+=),以及輸出流操作,并用一個主函數(shù)驗證。 include include enum si

13、gnminus,plus; /正負(fù)數(shù)的符號標(biāo)識 /類Money定義部分 class Money /類Money定義 例14設(shè)計一個人民幣類,其方法包friend ostream&operator99)/共有成員函數(shù) cerr分必須小于等于9999) cerr分必須小于等于99endl; exit(1); amount=d*100+c; if(s=minus)amount=-amount; return true; Money Money:operator+(const Money&x)const/操作符+重載 Money y; y.amount=amount+x.amount; return

14、y; exit(1);ostream& operator(ostream& out, const Money& x)/流類的操作符重載。 前邊不再需標(biāo)識符friend Money temp = x;/注意臨時對象temp絕對不能定義為引用型 if(x.amount 0 ) out -; temp = -temp; /temp為x的絕對值 long d = temp / 100;/d為amount的元值ostream& operator(ostream& oout ¥ d .; int c = temp - d * 100; /c為amount的分值 if(c 10) out 0; /分值小于1

15、0時在十位上添0 out c; return out; /主函數(shù)部分 void main(void) Money g, h(plus, 3, 30), hg;out ¥ d .;g.Set(minus, 2, 25); hg = h + g; /h和g的值均不變 g += h; /g的值被改變 cout h + g = hg endl; cout g = g endl; 程序運行輸出: h + g = ¥1.05 g = ¥1.05 下面我們對C+類基本要素的分析討論將以例14為實例。 g.Set(minus, 2, 25); 1.3.1 類的存取權(quán)限 類的數(shù)據(jù)和成員函數(shù)的存取權(quán)限分為三種:

16、私有(private)、公有(public)和保護(protected)。 在private域中, 聲明的數(shù)據(jù)和成員函數(shù)構(gòu)成類的私有部分, 私有部分中的數(shù)據(jù)和成員函數(shù)只能由該類對象的成員函數(shù), 以及被聲明為友元的函數(shù)或聲明為友元的類的對象的成員函數(shù)訪問。 1.3.1 類的存取權(quán)限 在public域中,一般僅聲明類的成員函數(shù)(有些情況下,也在此域中聲明類的數(shù)據(jù))。在public域中,聲明的類的數(shù)據(jù)和成員函數(shù)構(gòu)成類的公有部分;公有部分中的數(shù)據(jù)和成員函數(shù)既允許該類對象的成員函數(shù)訪問,也允許程序中其他函數(shù)或其他類的對象的成員函數(shù)訪問。因此,一個類的公有部分就構(gòu)成了這個類的操作界面。外部函數(shù)和別的對象通

17、過操作界面對類中的對象進行操作。這就和基本數(shù)據(jù)類型中int類數(shù)據(jù)均通過加(+)、減(-)、乘(*)、除(/)等操作界面來對該數(shù)據(jù)類型中所有數(shù)據(jù)進行操作一樣。 在public域中,一般僅聲明類的 1.3.2 構(gòu)造函數(shù)和析構(gòu)函數(shù) 構(gòu)造函數(shù)是一種特殊的成員函數(shù)。構(gòu)造函數(shù)是用來在內(nèi)存中建立類的具體對象(即在內(nèi)存中為該對象分配適當(dāng)?shù)目臻g)并對其進行初始化賦值的成員函數(shù)。構(gòu)造函數(shù)的名字必須和類的名字相同,構(gòu)造函數(shù)沒有返回值。構(gòu)造函數(shù)允許參數(shù)有默認(rèn)值,當(dāng)構(gòu)造函數(shù)有默認(rèn)值時,若定義該類的對象時沒有給出初始化值則按默認(rèn)值處理。例14中對象h有初始化值(plus,3,30),對象g和hg沒有初始化值,因此對象g和

18、hg的初始化值為默認(rèn)值(plus,0,0)。一個類允許有多個構(gòu)造函數(shù)。當(dāng)一個類有多個構(gòu)造函數(shù)時,系統(tǒng)將根據(jù)定義對象時的參數(shù)類型和參數(shù)個數(shù),選擇恰當(dāng)?shù)臉?gòu)造函數(shù)來建立對象和對該對象進行初始化。 1.3.2 構(gòu)造函數(shù)和析構(gòu)函數(shù) 析構(gòu)函數(shù)是一種當(dāng)對象被取消時才被自動調(diào)用的特殊函數(shù)。當(dāng)一個對象被取消時,析構(gòu)函數(shù)提供了自動釋放由構(gòu)造函數(shù)在內(nèi)存中建立的該類對象的內(nèi)存區(qū)。析構(gòu)函數(shù)的名字是在類的名字前面加上前綴“”,析構(gòu)函數(shù)沒有返回值。由于在一般情況下建立的對象當(dāng)被取消時,系統(tǒng)都能自動識別出所占用的相應(yīng)的內(nèi)存區(qū),所以一般情況下析構(gòu)函數(shù)的函數(shù)體為空。函數(shù)體為空的析構(gòu)函數(shù)可省略。但當(dāng)對象被取消時系統(tǒng)不能自動識別出所

19、占用的內(nèi)存區(qū)的類,析構(gòu)函數(shù)的函數(shù)體就不能為空,此時析構(gòu)函數(shù)就要負(fù)責(zé)釋放對象所占用的內(nèi)存區(qū)。每個類只能有一個析構(gòu)函數(shù)。 析構(gòu)函數(shù)是一種當(dāng)對象被取消時才被自動 1.3.3 操作符重載 當(dāng)所設(shè)計類的某個成員函數(shù)功能和人們熟悉的某個有固定操作符的函數(shù)功能類同時,可以用該操作符替換該成員函數(shù)名,這稱作操作符重載。操作符重載時,操作符前使用標(biāo)識符operator。對用戶來說,操作符重載使類的成員函數(shù)的調(diào)用更加方便。如例1-4中的加(+)和加等于(+=)成員函數(shù)通過操作符重載方便了用戶的調(diào)用。也就是說,一個類成員函數(shù)的操作符重載就是用一個有固定含義的操作符定義和實現(xiàn)該類的相應(yīng)成員函數(shù)。 1.3.3 操作符重

20、載 當(dāng)調(diào)用時該操作符可以看成是該操作符左邊對象的成員函數(shù)。如例14中的g+=hg可看作是加等于(+=)成員函數(shù)的對象,h可看作是加等于(+=)成員函數(shù)的參數(shù)。操作符重載不僅可以更方便地實現(xiàn)相應(yīng)成員函數(shù)的功能,重載的操作符還具有相應(yīng)的運算優(yōu)先級和滿足結(jié)合律,這是類的成員函數(shù)所沒有的功能。 當(dāng)調(diào)用時該操作符可以看成是該操作符左 成員函數(shù)的操作符重載時必須滿足: (1)操作符必須滿足運算優(yōu)先級和結(jié)合律,以及參數(shù)滿足相應(yīng)的操作符對操作數(shù)個數(shù)的要求,如二元操作加(+)必須有也只能有一個參數(shù)作為加數(shù)。 (2)C+中的所有操作符基本上都可被重載,但逗號操作(,)和條件表達式操作(?:)不允許重載。 (3)操

21、作符重載時不允許參數(shù)有默認(rèn)賦值。 (4)當(dāng)重載的操作符左邊的對象屬類B,右邊的對象屬類A時,該重載的操作符應(yīng)定義為類A的友元;否則類B的對象不能操作類A對象中的數(shù)據(jù)。 成員函數(shù)的操作符重載時必須滿足: 操作符重載不僅可以定義為成員函數(shù),也可以定義為一般函數(shù)。當(dāng)類的定義和實現(xiàn)已經(jīng)編譯完成,而在應(yīng)用時具體定義的數(shù)據(jù)類型不支持類的定義和實現(xiàn)中使用的運算符時,定義為一般函數(shù)的操作符重載可不改變原先已編譯完成的類的定義和實現(xiàn)。一般函數(shù)的二元操作符重載需有兩個參數(shù),這一點和成員函數(shù)的操作符重載不同。3.5.2節(jié)的小于()操作符的重載就是一個一般函數(shù)的例子,此時,原先已編譯完成的類的定義和實現(xiàn)不用改動。 操

22、作符重載不僅可以定義為成員函數(shù), 1.3.4友元 在例14中,Money類的輸出成員函數(shù)和系統(tǒng)的輸出流操作()功能類同,因此我們也希望重載輸出流操作符,但對于如下操作符重載定義ostream&operator(ostream&out,constMoney&x);由于該操作符左邊的對象屬類ostream,右邊的對象屬類Money,類ostream的對象不能存取類Money對象的私有數(shù)據(jù)amount,因而無法實現(xiàn)期望的輸出流操作。 1.3.4友元 對于上述這種情況,我們可以在類Money的定義中定義類ostream的成員函數(shù)(或說操作符)是類Money的友元。在C+中一個類的友元可以存取這個類的私

23、有數(shù)據(jù)。這樣當(dāng)我們在例14類Money的定義中有如下友元定義friendostream&operator(ostream&out,constMoney&x);則上述問題即可解決。友元定義使用標(biāo)識符friend。一個類的友元不僅可以是其他類的成員函數(shù),還可以是外部函數(shù)或其他類。當(dāng)類A的友元是類B時,則類B中的所有成員函數(shù)均可存取類A的私有數(shù)據(jù)。 對于上述這種情況,我們可以在類Mo 1.3.5 分辨符 在例14中,類的實現(xiàn)部分中類成員函數(shù)名前的符號:稱為分辨符。分辨符指定了成員函數(shù)所屬的類。當(dāng)類的實現(xiàn)部分和類的定義部分不在一個文件中時,在實現(xiàn)部分的成員函數(shù)名前使用分辨符是必要的。此外,在一個有派生

24、類存在的函數(shù)或程序中,若派生類和其基類有同名的成員函數(shù)時,在分辨符:前加上派生類名或基類名并放在該成員函數(shù)名前就可實現(xiàn)正確的訪問。 1.3.5 分辨符 1.3.6內(nèi)聯(lián)函數(shù) C+類成員函數(shù)的實現(xiàn)部分中包括在定義部分的函數(shù)稱為內(nèi)聯(lián)函數(shù)。編譯系統(tǒng)在遇到內(nèi)聯(lián)函數(shù)時會將其實現(xiàn)部分的所有語句直接插入到調(diào)用程序中,因而減少了與函數(shù)調(diào)用和參數(shù)傳遞有關(guān)的系統(tǒng)開銷,從而可以幫助C+克服在某些面向?qū)ο箝_發(fā)環(huán)境或開發(fā)工具中遇到的執(zhí)行速度低的難題。由于內(nèi)聯(lián)函數(shù)增加函數(shù)調(diào)用的空間開銷,因此通常只在實現(xiàn)部分語句較少或在要求系統(tǒng)的響應(yīng)速度較高時才使用內(nèi)聯(lián)函數(shù)。 1.3.6內(nèi)聯(lián)函數(shù) 例13中類Temperature的構(gòu)造函數(shù)和

25、例14中類Money的加等于(+=)操作符重載都是內(nèi)聯(lián)成員函數(shù)的例子。外部函數(shù)的內(nèi)聯(lián)函數(shù)為在函數(shù)定義頭部加標(biāo)識符inline。當(dāng)成員函數(shù)的實現(xiàn)部分較長時,定義內(nèi)聯(lián)函數(shù)的方法也是在成員函數(shù)頭部加標(biāo)識符inline來實現(xiàn)。 例13中類Temperature的構(gòu)造函數(shù)和例1 1.3.7 默認(rèn)值 若定義類時,類的構(gòu)造函數(shù)定義了默認(rèn)值。定義對象有初始化值時,則該對象取其初始化值;定義對象沒有初始化值時,則該對象取其默認(rèn)值。在例14中,類Money的構(gòu)造函數(shù)定義有默認(rèn)值(plus,0,0)。類Money的構(gòu)造函數(shù)定義語句為 Money(signs=plus,unsignedlongd=0,unsigned

26、longc=0) 1.3.7 默認(rèn)值 1.3.8 多態(tài)性和虛函數(shù) 多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個重要概念。在面向?qū)ο笳Z言中,用向一個對象發(fā)送消息的方式來完成一系列動作的實現(xiàn)。多態(tài)性是指當(dāng)相同對象收到不同的消息或不同對象收到相同的消息時產(chǎn)生不同的實現(xiàn)動作。C+支持兩種多態(tài)性:一種是編譯時的多態(tài)性,另一種是運行時的多態(tài)性。編譯時的多態(tài)性是通過重載函數(shù)來實現(xiàn)的。此時重載的函數(shù)有兩種:一種是在一個類中說明的重載,此時靠參數(shù)的個數(shù)和參數(shù)的類型不同來區(qū)分;另一種是基類成員函數(shù)在派生類中的重載, 1.3.8 多態(tài)性和虛函數(shù) 此時也可以靠參數(shù)的個數(shù)和參數(shù)的類型不同來區(qū)分,當(dāng)參數(shù)的個數(shù)和參數(shù)的類型相同時還可以靠

27、使用“類名:”加以區(qū)分。在C+中運行時的多態(tài)性是用虛函數(shù)來實現(xiàn)的。虛函數(shù)是在基類中被說明為virtual,并在派生類中重新定義的成員函數(shù)。虛函數(shù)允許函數(shù)調(diào)用與函數(shù)體之間的聯(lián)系在運行時才建立,也就是在運行時才決定當(dāng)前實際調(diào)用的是基類和派生類中哪一個類中的成員函數(shù),因此,虛函數(shù)可實現(xiàn)成員函數(shù)的動態(tài)重載。 此時也可以靠參數(shù)的個數(shù)和參數(shù)的類型不例15虛函數(shù)方法 includeclassParent protected: charversion; public: Parent()version=A; /構(gòu)造函數(shù) virtualvoidPrint() /虛函數(shù) printf(nParentVersion%

28、c,version); voidTest() /測試?yán)^承方式用函數(shù) printf(nPublicModeTest!); ;例15虛函數(shù)方法classDerived1:publicParentprivate:intinfo;public:Derived1(intnumber) /構(gòu)造函數(shù)version=1;info=number;voidPrint()printf(nDerived1info:%d,Version%c,info,version);classDerived2:publicParentclassDerived1:publicParentprivate:intinfo;public:D

29、erived2(intnumber) /構(gòu)造函數(shù)version=2;info=number;voidPrint()printf(nDerived2info:%d,Version%c,info,version);voidPrintInfo(Parent&infoHolder)infoHolder.Print();/根據(jù)不同的調(diào)用對象動態(tài)連接不同對象的成員函數(shù)voidmain(void)Parentbase;Derived1d1(10);Derived2d2(20);PrintInfo(base);voidPrintInfo(Parent&infoHoldePrintInfo(d1);PrintI

30、nfo(d2);d1.Test(); /此語句只在public派生方式下允許程序的輸出是: ParentVersionADerived1info:10,Version1Derived2info:20,Version2PublicModeTest! PrintInfo(d1); 在程序中,通過外部函數(shù)PrintInfo()實現(xiàn)類繼承層次中對象的動態(tài)綁定。在程序中,若去掉類Parent中成員函數(shù)Print()前的virtual,則程序的輸出是: ParentVersionA ParentVersion1 ParentVersion2 PublicModeTest! 顯然,若去掉類Parent中成員

31、函數(shù)Print()前的virtual,則每次調(diào)用的都是類Parent的成員函數(shù)Print()。 在程序中,通過外部函數(shù)PrintIn 1.3.9 純虛函數(shù)和抽象類 有些基類只表達一些抽象的概念,并不和具體的事物相聯(lián)系,所以在這些基類中定義某些成員函數(shù)是無意義的,但這些基類又必須為他的派生類提供一個公共接口界面,這樣的基類可定義成純虛函數(shù)。 純虛函數(shù)是在基類中說明的虛函數(shù),它在基類中沒有定義,但要求任何派生類都要定義自己的實現(xiàn)方法。在基類中實現(xiàn)純虛函數(shù)的方法是在函數(shù)原型后加上“=0”。例如: 1.3.9 純虛函數(shù)和抽象類 classParent virtualvoidFunction()=0;/

32、純虛函數(shù) ; 包含有純虛函數(shù)的類稱為抽象類。由于抽象類包含了沒有函數(shù)定義的純虛函數(shù),所以不能定義抽象類的對象。當(dāng)然,在抽象類中也可以定義非純虛函數(shù)供派生類繼承。 classParent 1.3.10 派生類繼承方式 派生類繼承基類時,基類的protected數(shù)據(jù)和成員函數(shù)將作為派生類的protected數(shù)據(jù)和成員函數(shù)。除此之外,派生類定義中的訪問控制還定義了基類成員在派生類中的訪問權(quán)限。訪問控制主要有public和private兩種繼承方式。 1.3.10 派生類繼承方式 在public繼承方式中,基類的公有成員成為派生類的公有成員。在例15中,派生類Derived1和Derived2對父類P

33、arent的繼承是public繼承方式。public繼承方式的派生類對象能直接使用基類的所有public的數(shù)據(jù)和成員函數(shù),因此,例15主函數(shù)中的d1.Test()調(diào)用的是Parent類的成員函數(shù)Test();private繼承方式使基類的公有成員成為派生類的私有成員。 在public繼承方式中,基類的公有 因此,在派生類中只允許其成員函數(shù)調(diào)用基類的公有成員函數(shù),private繼承方式的例子詳見3.3.1節(jié)和3.3.2節(jié)順序堆棧類對順序表類的繼承。無論是public繼承方式還是private繼承方式,基類的私有成員都成為派生類的不可訪問成員。此外,類的友元沒有繼承性。當(dāng)基類中有虛函數(shù)時,派生類只能是public繼承方式,不能是private繼承方式。 因此,在派生類中只允許其成員函數(shù)調(diào) 1.3.11 結(jié)構(gòu)體 C+語言是從C語言發(fā)展而來的,面向?qū)ο蟪绦蛟O(shè)計中的類是結(jié)構(gòu)化程序設(shè)計中結(jié)構(gòu)體的進一步發(fā)展,為了使習(xí)慣于使用C語言結(jié)構(gòu)體的編程人員能習(xí)慣使用C+語言中的類,C+語言中定義結(jié)構(gòu)體和類概念基本相同,惟一不同之處是結(jié)構(gòu)體中都是共有數(shù)據(jù)成員和共有成員函數(shù),沒有私有數(shù)據(jù)成員和私有成員函數(shù)。 1.3.11 結(jié)構(gòu)體 1.3.12 對象 具有類類型的變量稱作對象,或者說,對象是類的實例化。例15中base、d1和d2就分別是類

溫馨提示

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

評論

0/150

提交評論