第1章 C++面向對象程序的設計要點ppt課件_第1頁
第1章 C++面向對象程序的設計要點ppt課件_第2頁
第1章 C++面向對象程序的設計要點ppt課件_第3頁
第1章 C++面向對象程序的設計要點ppt課件_第4頁
第1章 C++面向對象程序的設計要點ppt課件_第5頁
已閱讀5頁,還剩62頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第1章 C+面向對象程序設計要點 第第1章章 C+面向對象程序設計要點面向對象程序設計要點 1.1 函數和函數參數函數和函數參數 1.2 輸入輸出輸入輸出 1.3 類類1.4 抽象類型和模板抽象類型和模板第1章 C+面向對象程序設計要點 1.1 函數和函數參數函數和函數參數 1.1.1函數類型 C+中有兩種類型函數:常規函數和成員函數。常規函數用于完成一個特定的功能,成員函數用于類方法的定義。無論是常規函數還是成員函數,其定義都包括四個部分:函數名、形式參數表、返回類型和函數體。 第1章 C+面向對象程序設計要點 函數的使用者通過函數名來調用函數,調用過程是把實際參數表傳送給形式參數表作為函數

2、的數據來源,然后執行函數體中的語句實現該函數的功能,最后得到的返回值由函數名帶回函數的調用者。成員函數是用于類方法定義的,因而,只有該類的對象才能調用其成員函數。 第1章 C+面向對象程序設計要點 1.1.2 函數名重載 C+允許函數名重載,即允許若干個相同的函數名能在相同作用域內使用。編譯系統根據函數引用的參數類型和參數個數判明函數的使用。 例11函數名重載 include int max(int a,int b) if(a=b)return a; else return b; 第1章 C+面向對象程序設計要點 Float max(float a,float b,float c) if(a=

3、b&a=c)return a; else if(ac)return b;else return 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); 第1章 C+面向對象程序設計要點 1.1.3 函數參數 C+中函數包括常規函數和成員函數參數有四種方式:值參數、常值參數、引用參數和常值引用參數等方式。但常值參數方式因無必要,一般不用。要注意的是,不同方式的參數不同方式的返回值也類同)在函數的傳遞調用中系統將視為不同的數據類型,如定義有函數f1(intx), 第1

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

5、 intExample2(int& a,int& b,int& c)/引用參數方式 int x,y,z; x=a;y=b;z=c; a=2*a;b=2*b;c=2*c;/函數返回后對應實際參數的值改變 return(x+y+z)/3; 第1章 C+面向對象程序設計要點 intExample3(const int& a,const int& b,cons tint&c) /常值引用參數方式 return(a+b+c)/3; /不允許改變常值引用參數a,b,c的值 第1章 C+面向對象程序設計要點 引用參數的方法是在類型名后加符號&,常值引用

6、參數的方法是在引用參數方法的基礎上再在函數定義行的最前邊加保留字const。 對于Example1的值參數方式,在運行時,對應的實際參數的值拷貝給形式參數,當函數終止時,形式參數的值不拷貝回實際參數。因而,值參數方式的函數調用不會改變對應形式參數的實際參數的值。 第1章 C+面向對象程序設計要點 1.1.4成員函數返回值 和函數參數的方式類同,成員函數返回值也有值方式、常值方式、引用方式和常值引用方式等四種方式。 當成員函數的返回值為值方式時,允許改變該對象的私有成員數據。注意,成員函數的返回值為無const標識符的任何數據類型包括void類型時即為值方式。 第1章 C+面向對象程序設計要點

7、例13成員函數返回值的值方式和常值方式includeclass Temperature private: float high Temp /最高溫度 float low Temp; /最低溫度第1章 C+面向對象程序設計要點 public: Temperature(float h,float l)high Temp=h;lowTemp=l; void Update Temp(float temp);/成員函數返回值為值方式 float GetHigh Temp(void)const;/成員函數返回值為常值方式 float GetLowTemp(void)const;/成員函數返回值為常值方式

8、; void Temperature:Update Temp(float temp) 第1章 C+面向對象程序設計要點 if(temphighTemp)highTemp=temp;/允許更改私有數據 if(temp,cout和cerr對象屏幕輸出的操作符為。 第1章 C+面向對象程序設計要點 include void main(void) char c; int n; coutn; coutn=nendl;第1章 C+面向對象程序設計要點 1.2.2文件輸入輸出 調用打開文件函數時,打開文件函數的參數包括文件名和數據流動的方向,打開文件函數返回文件的開始地址。系統在存儲文件時,在其末尾添加有文

9、件結束標記,這樣打開文件函數就具體地指定了一個文件在內存中的起始位置、結束位置和數據流動的方向。 fstream.h流類中定義了文件輸入類和文件輸出類。文件輸入類的類名為ifstream,文件輸出類的類名為ofstream。 第1章 C+面向對象程序設計要點 includeincludeinclude /包含exit()函數 Void main(void) ifstream fin; /定義fin為ifstream 類的對象 ofstream fout; /定義fout為ofstream類的對象 fout.open(exam.dat,ios:out);/建立輸出文件exam.dat第1章 C+

10、面向對象程序設計要點 /輸出字符串wang和數字50到輸出文件exam.dat中可打開該文件查看)char name=wang,name210;int age=50,age2;foutnameendl;foutageendl;fin.open(exam.dat,ios:in|ios:nocreate);/打開輸入文件exam.datif (!fin)第1章 C+面向對象程序設計要點 cerr不能打開文件exam.datname2cage2; /屏幕輸出查看coutname2=name2endl;coutage2=ageendl;第1章 C+面向對象程序設計要點 1.3 類類 當開發的應用程序的

11、數據類型不是int、float、char等系統支持的基本數據類型時,開發者就需定義自己的數據類型。C+中定義自己的數據類型的面向對象方法是使用類。 類是C+支持面向對象程序設計的基礎。C+中定義類使用標識符class,類定義包括類中數據的定義和成員函數的定義。第1章 C+面向對象程序設計要點 例14設計一個人民幣類,其方法包括設置、加(+)、加等于(+=),以及輸出流操作,并用一個主函數驗證。 include include enum signminus,plus; /正負數的符號標識 /類Money定義部分 class Money /類Money定義 第1章 C+面向對象程序設計要點 fri

12、end ostream&operator99)第1章 C+面向對象程序設計要點 cerr分必須小于等于9999) cerr分必須小于等于99endl; 第1章 C+面向對象程序設計要點 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 y; 第1章 C+面向對象程序設計要點 ostream& operator(o

13、stream& out, const Money& x)/流類的操作符重載。 前邊不再需標識符friend Money temp = x;/注意臨時對象temp絕對不能定義為引用型 if(x.amount 0 ) out -; temp = -temp; /temp為x的絕對值 long d = temp / 100;/d為amount的元值第1章 C+面向對象程序設計要點 out ¥ d .; int c = temp - d * 100; /c為amount的分值 if(c 10) out 0; /分值小于10時在十位上添0 out c; return out; /主函數部

14、分 void main(void) Money g, h(plus, 3, 30), hg;第1章 C+面向對象程序設計要點 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為實例。 第1章 C+面向對象程序設計要點 1.3.1 類的存取權限 類的數據和成員函數的存取權限分為三種: 私有private)、公有public和保護protecte

15、d)。 在private域中, 聲明的數據和成員函數構成類的私有部分, 私有部分中的數據和成員函數只能由該類對象的成員函數, 以及被聲明為友元的函數或聲明為友元的類的對象的成員函數訪問。 第1章 C+面向對象程序設計要點 在public域中,一般僅聲明類的成員函數有些情況下,也在此域中聲明類的數據)。在public域中,聲明的類的數據和成員函數構成類的公有部分;公有部分中的數據和成員函數既允許該類對象的成員函數訪問,也允許程序中其他函數或其他類的對象的成員函數訪問。因而,一個類的公有部分就構成了這個類的操作界面。外部函數和別的對象通過操作界面對類中的對象進行操作。這就和基本數據類型中int類數

16、據均通過加(+)、減(-)、乘(*)、除(/)等操作界面來對該數據類型中所有數據進行操作一樣。第1章 C+面向對象程序設計要點 1.3.2 構造函數和析構函數 構造函數是一種特殊的成員函數。構造函數是用來在內存中建立類的具體對象即在內存中為該對象分配適當的空間并對其進行初始化賦值的成員函數。構造函數的名字必須和類的名字相同,構造函數沒有返回值。構造函數允許參數有默認值,當構造函數有默認值時,若定義該類的對象時沒有給出初始化值則按默認值處理。例14中對象h有初始化值(plus,3,30),對象g和hg沒有初始化值,因此對象g和hg的初始化值為默認值plus,0,0)。一個類允許有多個構造函數。當

17、一個類有多個構造函數時,系統將根據定義對象時的參數類型和參數個數,選擇恰當的構造函數來建立對象和對該對象進行初始化。第1章 C+面向對象程序設計要點 析構函數是一種當對象被取消時才被自動調用的特殊函數。當一個對象被取消時,析構函數提供了自動釋放由構造函數在內存中建立的該類對象的內存區。析構函數的名字是在類的名字前面加上前綴“”,析構函數沒有返回值。由于在一般情況下建立的對象當被取消時,系統都能自動識別出所占用的相應的內存區,所以一般情況下析構函數的函數體為空。函數體為空的析構函數可省略。但當對象被取消時系統不能自動識別出所占用的內存區的類,析構函數的函數體就不能為空,此時析構函數就要負責釋放對

18、象所占用的內存區。每個類只能有一個析構函數。第1章 C+面向對象程序設計要點 1.3.3 操作符重載 當所設計類的某個成員函數功能和人們熟悉的某個有固定操作符的函數功能類同時,可以用該操作符替換該成員函數名,這稱作操作符重載。操作符重載時,操作符前使用標識符operator。對用戶來說,操作符重載使類的成員函數的調用更加方便。如例1-4中的加(+)和加等于(+=)成員函數通過操作符重載方便了用戶的調用。也就是說,一個類成員函數的操作符重載就是用一個有固定含義的操作符定義和實現該類的相應成員函數。 第1章 C+面向對象程序設計要點 當調用時該操作符可以看成是該操作符左邊對象的成員函數。如例14中

19、的g+=hg可看作是加等于(+=)成員函數的對象,h可看作是加等于(+=)成員函數的參數。操作符重載不僅可以更方便地實現相應成員函數的功能,重載的操作符還具有相應的運算優先級和滿足結合律,這是類的成員函數所沒有的功能。第1章 C+面向對象程序設計要點 成員函數的操作符重載時必須滿足: (1操作符必須滿足運算優先級和結合律,以及參數滿足相應的操作符對操作數個數的要求,如二元操作加(+)必須有也只能有一個參數作為加數。 (2C+中的所有操作符基本上都可被重載,但逗號操作(,)和條件表達式操作(?:)不允許重載。 (3操作符重載時不允許參數有默認賦值。 (4當重載的操作符左邊的對象屬類B,右邊的對象

20、屬類A時,該重載的操作符應定義為類A的友元;否則類B的對象不能操作類A對象中的數據。第1章 C+面向對象程序設計要點 操作符重載不僅可以定義為成員函數,也可以定義為一般函數。當類的定義和實現已經編譯完成,而在應用時具體定義的數據類型不支持類的定義和實現中使用的運算符時,定義為一般函數的操作符重載可不改變原先已編譯完成的類的定義和實現。一般函數的二元操作符重載需有兩個參數,這一點和成員函數的操作符重載不同。3.5.2節的小于()操作符的重載就是一個一般函數的例子,此時,原先已編譯完成的類的定義和實現不用改動。第1章 C+面向對象程序設計要點 1.3.4友元 在例14中,Money類的輸出成員函數

21、和系統的輸出流操作()功能類同,因此我們也希望重載輸出流 操 作 符 , 但 對 于 如 下 操 作 符 重 載 定 義ostream&operator(ostream&out,constMoney&x);由于該操作符左邊的對象屬類ostream,右邊的對象屬類Money,類ostream的對象不能存取類Money對象的私有數據amount,因而無法實現期望的輸出流操作。第1章 C+面向對象程序設計要點 對于上述這種情況,我們可以在類Money的定義中定義類ostream的成員函數或說操作符)是類Money的友元。在C+中一個類的友元可以存取這個類的私有數據。這樣當我們

22、在例14類Money的定義中有如下友元定義friendostream&operator(ostream&out,constMoney&x);則上述問題即可解決。友元定義使用標識符friend。一個類的友元不僅可以是其他類的成員函數,還可以是外部函數或其他類。當類A的友元是類B時,則類B中的所有成員函數均可存取類A的私有數據。第1章 C+面向對象程序設計要點 1.3.5 分辨符 在例14中,類的實現部分中類成員函數名前的符號:稱為分辨符。分辨符指定了成員函數所屬的類。當類的實現部分和類的定義部分不在一個文件中時,在實現部分的成員函數名前使用分辨符是必要的。此外,在一個有派

23、生類存在的函數或程序中,若派生類和其基類有同名的成員函數時,在分辨符:前加上派生類名或基類名并放在該成員函數名前就可實現正確的訪問。第1章 C+面向對象程序設計要點 1.3.6內聯函數 C+類成員函數的實現部分中包括在定義部分的函數稱為內聯函數。編譯系統在遇到內聯函數時會將其實現部分的所有語句直接插入到調用程序中,因而減少了與函數調用和參數傳遞有關的系統開銷,從而可以幫助C+克服在某些面向對象開發環境或開發工具中遇到的執行速度低的難題。由于內聯函數增加函數調用的空間開銷,因此通常只在實現部分語句較少或在要求系統的響應速度較高時才使用內聯函數。 第1章 C+面向對象程序設計要點 例13中類Tem

24、perature的構造函數和例14中類Money的加等于(+=)操作符重載都是內聯成員函數的例子。外部函數的內聯函數為在函數定義頭部加標識符inline。當成員函數的實現部分較長時,定義內聯函數的方法也是在成員函數頭部加標識符inline來實現。第1章 C+面向對象程序設計要點 1.3.7 默認值 若定義類時,類的構造函數定義了默認值。定義對象有初始化值時,則該對象取其初始化值;定義對象沒有初始化值時,則該對象取其默認值。在例14中,類Money的構造函數定義有默認值plus,0,0)。類 M o n e y 的 構 造 函 數 定 義 語 句 為 Money(signs=plus,unsig

25、nedlongd=0,unsignedlongc=0)第1章 C+面向對象程序設計要點 1.3.8 多態性和虛函數 多態性是面向對象程序設計的一個重要概念。在面向對象語言中,用向一個對象發送消息的方式來完成一系列動作的實現。多態性是指當相同對象收到不同的消息或不同對象收到相同的消息時產生不同的實現動作。C+支持兩種多態性:一種是編譯時的多態性,另一種是運行時的多態性。編譯時的多態性是通過重載函數來實現的。此時重載的函數有兩種:一種是在一個類中說明的重載,此時靠參數的個數和參數的類型不同來區分;另一種是基類成員函數在派生類中的重載, 第1章 C+面向對象程序設計要點 此時也可以靠參數的個數和參數

26、的類型不同來區分,當參數的個數和參數的類型相同時還可以靠使用“類名:”加以區分。在C+中運行時的多態性是用虛函數來實現的。虛函數是在基類中被說明為virtual,并在派生類中重新定義的成員函數。虛函數允許函數調用與函數體之間的聯系在運行時才建立,也就是在運行時才決定當前實際調用的是基類和派生類中哪一個類中的成員函數,因而,虛函數可實現成員函數的動態重載。第1章 C+面向對象程序設計要點 例15虛函數方法 includeclassParent protected: charversion; public: Parent()version=A; /構造函數 virtualvoidPrint() /

27、虛函數 printf(nParentVersion%c,version); voidTest() /測試繼承方式用函數 printf(nPublicModeTest!); ;第1章 C+面向對象程序設計要點 classDerived1:publicParentprivate:intinfo;public:Derived1(intnumber) /構造函數version=1;info=number;voidPrint()printf(nDerived1info:%d,Version%c,info,version);classDerived2:publicParent第1章 C+面向對象程序設計要

28、點 private:intinfo;public:Derived2(intnumber) /構造函數version=2;info=number;voidPrint()printf(nDerived2info:%d,Version%c,info,version);第1章 C+面向對象程序設計要點 voidPrintInfo(Parent&infoHolder)infoHolder.Print();/根據不同的調用對象動態連接不同對象的成員函數voidmain(void)Parentbase;Derived1d1(10);Derived2d2(20);PrintInfo(base);第1章

29、 C+面向對象程序設計要點 PrintInfo(d1);PrintInfo(d2);d1.Test(); /此語句只在public派生方式下允許程序的輸出是: ParentVersionADerived1info:10,Version1Derived2info:20,Version2PublicModeTest! 第1章 C+面向對象程序設計要點 在程序中,通過外部函數PrintInfo()實現類繼承層次中對象的動態綁定。在程序中,若去掉類Parent中成員函數Print()前的virtual,則程序的輸出是: ParentVersionA ParentVersion1 ParentVersi

30、on2 PublicModeTest! 顯然,若去掉類Parent中成員函數Print()前的virtual,則每次調用的都是類Parent的成員函數Print()。第1章 C+面向對象程序設計要點 1.3.9 純虛函數和抽象類 有些基類只表達一些抽象的概念,并不和具體的事物相聯系,所以在這些基類中定義某些成員函數是無意義的,但這些基類又必須為他的派生類提供一個公共接口界面,這樣的基類可定義成純虛函數。 純虛函數是在基類中說明的虛函數,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函數的方法是在函數原型后加上“=0”。例如:第1章 C+面向對象程序設計要點 cla

31、ssParent virtualvoidFunction()=0;/純虛函數 ; 包含有純虛函數的類稱為抽象類。由于抽象類包含了沒有函數定義的純虛函數,所以不能定義抽象類的對象。當然,在抽象類中也可以定義非純虛函數供派生類繼承。第1章 C+面向對象程序設計要點 1.3.10 派生類繼承方式 派生類繼承基類時,基類的protected數據和成員函數將作為派生類的protected數據和成員函數。除此之外,派生類定義中的訪問控制還定義了基類成員在派生類中的訪問權限。訪問控制主要有public和private兩種繼承方式。第1章 C+面向對象程序設計要點 在public繼承方式中,基類的公有成員成為

32、派生類的公有成員。在例15中,派生類Derived1和Derived2對父類Parent的繼承是public繼承方式。public繼承方式的派生類對象能直接使用基類的所有public的數據和成員函數,因而,例15主函數中的d1.Test()調用的是Parent類的成員函數Test();private繼承方式使基類的公有成員成為派生類的私有成員。 第1章 C+面向對象程序設計要點 因而,在派生類中只允許其成員函數調用基類的公有成員函數,private繼承方式的例子詳見3.3.1節和3.3.2節順序堆棧類對順序表類的繼承。無論是public繼承方式還是private繼承方式,基類的私有成員都成為派

33、生類的不可訪問成員。此外,類的友元沒有繼承性。當基類中有虛函數時,派生類只能是public繼承方式,不能是private繼承方式。第1章 C+面向對象程序設計要點 1.3.11 結構體 C+語言是從C語言發展而來的,面向對象程序設計中的類是結構化程序設計中結構體的進一步發展,為了使習慣于使用C語言結構體的編程人員能習慣使用C+語言中的類,C+語言中定義結構體和類概念基本相同,惟一不同之處是結構體中都是共有數據成員和共有成員函數,沒有私有數據成員和私有成員函數。第1章 C+面向對象程序設計要點 1.3.12 對象 具有類類型的變量稱作對象,或者說,對象是類的實例化。例15中base、d1和d2就分別是類Parent、Derived1和Derived2的對象。從上述的C+語言對結構體的定

溫馨提示

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

評論

0/150

提交評論