版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Object-OrientedProgramming in C++第二章 類和對象,中國科大學(xué)繼續(xù)教育學(xué)院 李藝leeyi@ustc.edu.cn,第一章 C++的初步知識第二章 類和對象第三章 再論類和對象第四章 運(yùn)算符重載第五章 繼承與派生第六章 多態(tài)性與虛函數(shù)第七章 輸入輸出流第八章 C++工具,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述2.2 類的聲明和對象的定義2.3 類的成員函數(shù)2.4 對象成員的引用
2、2.5 類和對象的舉例2.6 類的封裝和信息的隱藏,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是面向?qū)ο蟮某绦蛟O(shè)計?面向?qū)ο蟮某绦蛟O(shè)計(Object-Oriented Programming )和傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計的思路完全不同。面向?qū)ο蟮某绦蛟O(shè)計和人們?nèi)粘I罱鉀Q問題的思路是相似的。比如,我們生產(chǎn)汽車時,不是順序制造發(fā)動機(jī),在設(shè)計制造底盤、車身、輪子。而是分別設(shè)計制造發(fā)動機(jī)、底盤、車身和輪子,最后組裝在一起。組裝時,各部
3、件之間有聯(lián)系,以便協(xié)調(diào)工作。例如,司機(jī)踩油門,就能調(diào)節(jié)油路,控制發(fā)動機(jī)的轉(zhuǎn)速,就能驅(qū)動車輪。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,程序設(shè)計者的任務(wù)有兩個:一是設(shè)計所需要的類和對象,即確定那些數(shù)據(jù)和操作封裝在一起;二是考慮怎樣向有關(guān)對象發(fā)送消息,以啟動相關(guān)對象的操作。編程者如同一個總調(diào)度,不斷地向各個對象發(fā)出命令,讓這些對象活動起來,完成指定的工作。這就是面向?qū)ο蟮某绦蛟O(shè)計的基本思路。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是對
4、象(object)?一個對象由一組“屬性”和一組“行為”構(gòu)成。并根據(jù)外界給它的消息進(jìn)行相應(yīng)的操作。系統(tǒng)中多個對象通過一定的渠道相互聯(lián)系。任何事物都可以看成一個對象??梢允亲匀晃矬w,也可以是邏輯結(jié)構(gòu)。我們以一個班級為例。一個班級作為對象,有兩個要素:一是班級的靜態(tài)特征,如班級所屬的專業(yè),學(xué)生人數(shù)、班主任姓名等,這種靜態(tài)特征稱為“屬性”;另一個是班級的動態(tài)特征,如上課,體育比賽,開會等,稱為“行為”。外界向班級發(fā)一個信息(如上課
5、鈴聲,廣播通知),我們稱之為“消息”,班級就會發(fā)生一個操作(要么上課,要么開會),2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是C++對象?C++中,每個對象都由若干數(shù)據(jù)和若干函數(shù)組成。數(shù)據(jù)就是對象的“屬性”,函數(shù)就是用來對數(shù)據(jù)進(jìn)行的“操作”,以便實(shí)現(xiàn)某種功能。這種操作就是對象的“行為”,也叫“方法”。我們點(diǎn)擊一下鼠標(biāo),按動鍵盤的一個按鈕,就是給某個對象一個消息,系統(tǒng)回調(diào)用該對象中的函數(shù)進(jìn)行操作。比如長方形對象,其長和寬就是它的屬
6、性,調(diào)用該對象的一些函數(shù),即向該對象傳送一些消息,可以用來對其長、寬值進(jìn)行加工計算,以實(shí)現(xiàn)求出面積、周長等功能。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是對象封裝(encapsulation )?就是把對象的不鄉(xiāng)讓外界知道的屬性和功能屏蔽起來,讓外界看不見。封裝有兩個含義,一是將有關(guān)的數(shù)據(jù)和操作函數(shù)封裝成一個基本單位,即對象內(nèi)。各對象之間相互獨(dú)立,互不干擾;二是將對象中的部分屬性或功能對外隱蔽,只留少數(shù)接口向外公布,以接收外界信息
7、。對象封裝的好處在于,降低了人們操作對象的復(fù)雜程度。使用對象的人,不必知道對象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),只需要了解外部功能就可以自如地操作該對象。對象的行為由類的內(nèi)部數(shù)據(jù)結(jié)構(gòu)和相關(guān)的操作確定;外部行為通過操作接口實(shí)現(xiàn)。人們關(guān)心的就是操作接口所能提供的服務(wù)。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是抽象(abstraction)?將具有相同特性的事物歸納、集中成一個統(tǒng)一類型,稱為抽象。比如,把張三,李四,王五歸納為一類,我們稱之為
8、“人”。抽象的作用,是表示同類事物的本質(zhì)。如果你會操作自己家的電視機(jī),看到別人家里的電視機(jī)即使牌子不同,你也肯定會操作,因?yàn)樗须娨暀C(jī)具有共同的特性。C和C++中,數(shù)據(jù)類型就是對一批具體數(shù)據(jù)的抽象,整形數(shù)據(jù)就是所有整數(shù)的抽象?!邦悺笔恰皩ο蟆钡某橄?,“對象”則是類的“特例”,或“具體表現(xiàn)形式”。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是繼承( inherit )?生產(chǎn)汽車,一般不會從頭開始設(shè)計,而是選擇已有的某一
9、型號汽車為藍(lán)本,增加、修改一些功能就行了。軟件開發(fā)也是這樣,我們已經(jīng)有了一個名為“A”的類,還想建立一個名為“B”的類,而后者內(nèi)容只是在前者的基礎(chǔ)上增加了少量內(nèi)容。我們顯然不必重新設(shè)計一個新類B,只需要把A類拿過來,在此基礎(chǔ)上添加新內(nèi)容就可以了。這就是面向?qū)ο蟪绦蛟O(shè)計的繼承機(jī)制。C++提供繼承機(jī)制,大大節(jié)省了編程工作量,這就是所謂“軟件重用( software reusability )”的思想。對于大型軟件的開發(fā)具有重要意
10、義。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,什么是多態(tài)性( polymorphism )?如果有幾個相似而不同的對象,人們往往要求在向它們發(fā)出同一個消息時,各自作出不同的操作,這種情況就是“多態(tài)現(xiàn)象”。比如,高二1,2,3班,聽到上課鈴后,作出的動作是各自走進(jìn)自己的教室上課,而不會走錯教室。C++中,所謂多態(tài)性是指,由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會作出不同的響應(yīng)。顯然,多態(tài)性能增加程序的靈活性,它是面
11、向?qū)ο蟪绦蛟O(shè)計的重要特征。,2.1 面向?qū)ο蟪绦蛟O(shè)計方法概述,類與對象的作用C++全面支持傳統(tǒng)的面向過程的程序設(shè)計(即結(jié)構(gòu)化編程),也支持基于對象和面向?qū)ο蟮某绦蛟O(shè)計。所謂基于對象,是指程序是以類和對象為基礎(chǔ),程序的操作是圍繞對象進(jìn)行的。所謂面向?qū)ο?,是指,在基于對象的基礎(chǔ)上,利用了繼承機(jī)制和多態(tài)性。面向?qū)ο蟮某绦蛟O(shè)計特點(diǎn):類具有對數(shù)據(jù)的抽象性、封裝性、繼承性、多態(tài)性。,2.2 類的聲明和對象的定義,類和對象的
12、關(guān)系每一個實(shí)體都可以作為對象,一些對象具有相同的結(jié)構(gòu)和特性。如高一1班,2班,3班。他們是不同的對象,但具有完全相同的結(jié)構(gòu)的特性。每個對象都屬于一個特定的類型。C++中,對象的類型稱為類( class )。類代表了某一批對象的共同特性。前面已經(jīng)談到,類是對象的抽象,而對象是類的具體實(shí)例( instance )。就象結(jié)構(gòu)體類型和結(jié)構(gòu)體變量一樣。C++中,我們先聲明一個類的類型,然后再定義該類的若干對象。對象就是類這種類型
13、的一個變量。類是抽象的,不占內(nèi)存,而對象是具體的,要占用內(nèi)存空間。,2.2 類的聲明和對象的定義,類的聲明類的聲明方法和結(jié)構(gòu)體的聲明方法一樣,只是將關(guān)鍵字struct 換成class:class 類名{ private:私有數(shù)據(jù)成員和私有成員函數(shù); public:公共數(shù)據(jù)成員和公共成員函數(shù);};,成員訪問限定符( member access specifier ),成員訪問限定符( member acce
14、ss specifier ),別忘了必須用分號結(jié)束!,2.2 類的聲明和對象的定義,類的聲明示例class rectangle { private: int length, width, area, perimeter ; public: void PutArea ( ) { area = length * width;} void PutPerimeter ( ) { perimet
15、er = (length + width ) * 2; } void display ( ) { cout << “l(fā)ength = “<< length << endl; cout << “width = “<< width << endl; cout << “area = “ << area
16、<< endl; cout << “perimeter = “ << perimeter << endl; }};,在類的外面不能訪問私有成員,只能通過公有成員函數(shù)間接訪問,在類的外面可以訪問公有成員,2.2 類的聲明和對象的定義,對象的定義 聲明了類以后,就可以定義該類的對象了。其格式為: [class] 類名 對象名1,對象名2,… // 方
17、括號表示可選項(xiàng)對象定義示例 如前例中,聲明了一個名為 rectangle 的類,我們可以定義該類的若干對象:rectangle r1, r2, r3;對象定義說明 類的聲明和對象的定義可以想結(jié)構(gòu)體類型聲明和結(jié)構(gòu)體變量定義一樣,合在一起完成。請同學(xué)們自己閱讀教材48頁的內(nèi)容。,2.3 類的成員函數(shù),成員函數(shù)的性質(zhì)類的成員函數(shù)也叫類函數(shù),用法和一般函數(shù)基本上一樣。區(qū)別在于它只是屬于一個類的成員而出現(xiàn)在類
18、中。它可以被指定為類的私有成員( private )、公有成員( public )或保護(hù)成員( protected )。使用類函數(shù)時,要注意它的使用權(quán)限,如果是私有成員,只能被本類的其他成員函數(shù)調(diào)用,不能被類外調(diào)用。成員函數(shù)可以調(diào)用本類所有數(shù)據(jù)成員和成員函數(shù),也可以引用在本作用域中的有效數(shù)據(jù)。通常,我們把類的數(shù)據(jù)成員定義成私有成員,對外屏蔽,而把成員函數(shù)定義成公有成員,他可以調(diào)用私有成員和其它成員。一個類若沒有成員函數(shù)
19、,就退化成C語言的結(jié)構(gòu)體,而失去意義。,2.3 類的成員函數(shù),在類外定義成員函數(shù)成員函數(shù)一般在類體中定義,如前面所講。也可以在類外定義,但要指明是屬于哪個類的成員函數(shù),用“類名::函數(shù)名”來指定。例如:,class rectangle { private: int length, width,; int area, perimeter ; public: void PutArea ( ); v
20、oid PutPerimeter ( ); void display ( );};void rectangle:: PutArea ( ){ area = length * width;},void rectangle:: PutPerimeter ( ){ perimeter = (length + width ) * 2; }void rectangle:: display ( ){ cout <<
21、; “l(fā)ength = “<< length << endl; cout << “width = “<< width << endl; cout << “area = “ << area << endl; cout << “perimeter = “ << perimeter ; }rectangle
22、 r1, r2, r3;,這種類定義包括兩個部分:1、聲明部分(“做什么”): 數(shù)據(jù)成員(名稱、類型) 成員函數(shù)(方法)2、實(shí)現(xiàn)部分(“怎么做”): 成員函數(shù)的定義和實(shí)現(xiàn),,,,2.3 類的成員函數(shù),其中,“::”成為域限定符。如果在域限定符前沒有類名,或函數(shù)名前既沒有類名,又沒有域限定符:::display ( ) 或 display ( )則表示該函數(shù)不屬于任何類,
23、它不是成員函數(shù),而是全局函數(shù),即普通函數(shù)。inline 成員函數(shù)類的成員函數(shù)也可以指定為內(nèi)聯(lián)函數(shù),只要是函數(shù)代碼較少,有頻繁使用。我們只要在成員函數(shù)的類型簽名加上inline 關(guān)鍵字就可以。,2.3 類的成員函數(shù),成員函數(shù)的存儲方式同一類定義了多個對象時,每個對象的數(shù)據(jù)成員各自占據(jù)獨(dú)立的空間,而共享一個共用的函數(shù)代碼段,不占用對象的存儲空間。那么不同對象使用的是同一個函數(shù)代碼段,如何區(qū)分不同對象呢?C++為此專門設(shè)
24、立了一個名為 this 的指針,用來指向不同的對象。當(dāng)調(diào)用對象r1,成員函數(shù)訪問的就是r1的成員。,2.4 對象成員的引用,用對象名和成員運(yùn)算符( . )訪問對象成員舉例:用這種方式萬分的成員,必須定義成公用成員!,class rectangle { public: int length, width; // 公共數(shù)據(jù)成員 void display ( ); // 公共成員函數(shù)};void rectang
25、le:: display ( ){cout <<“area =“ << length* width <<ednl; cout<<“perimeter =“ <<( length+ width)*2; }void main ( ){ rectangle r1; r1.lenght = 5; //用對象名和成員運(yùn)算符)訪問數(shù)據(jù)成員 r1.width = 4;
26、 //用對象名和成員運(yùn)算符( . )訪問數(shù)據(jù)成員 r1.display ( ); //用對象名和成員運(yùn)算符( . )訪問成員函數(shù)},2.4 對象成員的引用,用指向?qū)ο蟮闹羔樤L問對象成員舉例:用這種方式萬分的成員,也必須定義成公用成員!(*p).length 被簡化成 p->length,class rectangle { public: int length, width; // 公共數(shù)據(jù)成員
27、void display ( ); // 公共成員函數(shù) };void rectangle:: display ( ){cout lenght = 5; p->width = 4; p->display ( ); },2.4 對象成員的引用,用對象的引用訪問對象成員舉例:,class rectangle { public: int length, width; // 公共數(shù)據(jù)成員
28、 void display ( ); // 公共成員函數(shù)};void rectangle:: display ( ){cout <<“area =“ << length* width <<ednl; cout<<“perimeter =“ <<( length+ width)*2; }void main ( ){ rectangle r2; re
29、ctangle &r3 = r2; //r3引用r2 r3.lenght = 5; r3.width = 4; r3.display ( ); },編程練習(xí),請同學(xué)們自己閱讀教材55頁2.5節(jié)的簡單示例程序。然后編寫下列程序:輸入三個整數(shù),并輸出它們之中的最大值。,2.6 類的封裝和信息隱蔽,公用接口和私有實(shí)現(xiàn)的分離我們已經(jīng)學(xué)到,C++通過類的封裝,將類的數(shù)據(jù)成員和成員函數(shù)集成到一個類中。而
30、一般在類的聲明時,往往把數(shù)據(jù)成員指定成私有的,使它們與外界隔離,即,不能在類外直接使用私有成員,外界只能通過類的公有函數(shù),間接進(jìn)行對私有成員的操作。換句話說,外界與類的私有成員的唯一聯(lián)系渠道,就是該類的公有成員函數(shù)。所以,我們一般把成員函數(shù)指定成公有的( public )性質(zhì)(除非某些成員函數(shù)不想讓外界調(diào)用)。這就是所謂的“外部接口”與內(nèi)部實(shí)現(xiàn)的分離,以起到信息隱蔽的作用。而這是軟件工程最基本的原則。,定義一個類就是實(shí)現(xiàn)對創(chuàng)
31、建一個對象的數(shù)據(jù)結(jié)構(gòu)的描述。 在類中,一些成員是保護(hù)的,被有效地屏蔽,以防外界的干擾和誤操作。 另一些成員是公共的,作為接口提供外界使用。 右圖是對它們采用的圖示方法說明類的組成結(jié)構(gòu)。以Point 類為例。,,,,2.6 類的封裝和信息隱蔽,類聲明和成員函數(shù)定義的分離當(dāng)一個類被多個程序使用時,一般將類的聲明(包括成員函數(shù)的聲明)放在指定的頭文件中,用戶在編程時,將該頭文件包含近來就可以了。而不必在每個
32、使用該類的程序中重復(fù)書寫該類的聲明。我們?nèi)缓罂梢灾苯釉诔绦蛑兄苯佣x該類的對象,直接調(diào)用該類的公有成員函數(shù)。為了實(shí)現(xiàn)信息隱蔽,對類的成員函數(shù)的定義一般不放在頭文件中,而放在另一個文件中。然后按照對多文件程序的編譯和運(yùn)行方法對程序進(jìn)行編譯和連接。請看下面示例。,2.6 類的封裝和信息隱蔽,// rectangle.hclass rectangle { private: int length, width; p
33、ublic: void Put ( ); void display ( ); };// rectangle.cpp#include #include “rectangle.h”void rectangle::Put ( ){ length = 5; width = 4; }void rectangle:: display ( ){ cout <<“area = “ <<
34、length*width << endl; },// main.cpp#include #include “rectangle.h”void main ( ){ rectangle r1; r1.display ( );},2.6 類的封裝和信息隱蔽,在實(shí)際運(yùn)用中,將若干功能相近的類聲明集中在一起,形成類庫。類庫包括兩個組成部分: 類聲明頭文件; 經(jīng)過編譯的頭文件函數(shù)的定義的目標(biāo)文件。用戶只需要將類
35、庫裝入自己的計算機(jī)中C++系統(tǒng)的子目錄下,并在程序中用#include命令將有關(guān)類聲明的頭文件包含到程序中,就可以使用這些類和其中的成員函數(shù)了。,2.6 類的封裝和信息隱蔽,面向?qū)ο蟪绦蛟O(shè)計中的幾個名詞方法:method,指對數(shù)據(jù)的操作。消息:其實(shí)就是一個命令,由程序語句實(shí)現(xiàn)。外界通過發(fā)送“消息”來激活有關(guān)的方法。比如:rectangle.dispaly ( );就是向rectangle對象發(fā)一個消息,通知它執(zhí)行
36、其中的“display ( )”方法。這一條語句就涉及到對象、消息、方法這三個術(shù)語。rectangel:是對象;display ( ):是方法;rectangel.display ( ):是消息。,本章練習(xí),試編寫一個基于對象的程序,求3個長方體的體積。長方體對象名為rectangle,數(shù)據(jù)成員包括:length,width,height。要求用成員函數(shù)實(shí)現(xiàn)以下功能:由鍵盤分別輸入3個長方體的長、寬、高;計算
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 法 - 中科大繼續(xù)教育學(xué)院
- 測試-中科大繼續(xù)教育學(xué)院
- 操作系統(tǒng)-中科大繼續(xù)教育學(xué)院
- 專利法-中科大繼續(xù)教育學(xué)院
- 商標(biāo)法-中科大繼續(xù)教育學(xué)院
- 軟件項(xiàng)目管理 - 中科大繼續(xù)教育學(xué)院
- 物流信息技術(shù)-中科大繼續(xù)教育學(xué)院
- 操作系統(tǒng)講稿-中科大繼續(xù)教育學(xué)院
- 著作權(quán)法-中科大繼續(xù)教育學(xué)院
- 經(jīng)濟(jì)法學(xué)教案-中科大繼續(xù)教育學(xué)院
- 系統(tǒng)分析-中科大繼續(xù)教育學(xué)院
- 第八講法的執(zhí)行-中科大繼續(xù)教育學(xué)院
- 第五講立法原理-中科大繼續(xù)教育學(xué)院
- 軟件項(xiàng)目管理 - 中科大繼續(xù)教育
- 繼續(xù)教育學(xué)院工作職責(zé)
- 北京印刷學(xué)院繼續(xù)教育學(xué)院
- 北京舞蹈學(xué)院繼續(xù)教育學(xué)院
- 上海戲劇學(xué)院繼續(xù)教育學(xué)院
- 南陽師范學(xué)院繼續(xù)教育學(xué)院
- 繼續(xù)教育學(xué)院畢業(yè)論文
評論
0/150
提交評論