面向?qū)ο蟪绦蛟O(shè)計(jì)C++:第3章 類(lèi)_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)C++:第3章 類(lèi)_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)C++:第3章 類(lèi)_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)C++:第3章 類(lèi)_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)C++:第3章 類(lèi)_第5頁(yè)
已閱讀5頁(yè),還剩37頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第3章 類(lèi)面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特征之一:封裝我正在看電視我正在看一個(gè)裝置上演的戲, (不是舞臺(tái)戲)是活動(dòng)圖像和聲音,是一個(gè)矩形框的裝置,(不是電影),是玻璃框, (不是投射的) 是通過(guò)天線(xiàn)接收電視臺(tái)發(fā)射的電信號(hào),再通過(guò)電子線(xiàn)路分離出視頻信號(hào)和音頻信號(hào),分別通過(guò)熒光屏和喇叭還原為圖像和聲音這樣交流太累了!要封裝!抽象百科名片:抽象是從眾多的事物中抽取出共同的、本質(zhì)性的特征,而舍棄其非本質(zhì)的特征。例如蘋(píng)果、香蕉、生梨、葡萄、桃子等,它們共同的特性就是水果。得出水果概念的過(guò)程,就是一個(gè)抽象的過(guò)程。程序設(shè)計(jì)的過(guò)程首先是一個(gè)抽象的過(guò)程(建模)類(lèi)是對(duì)象的集合體。類(lèi)描述了一組有相同特性(數(shù)據(jù)元素)和相同行

2、為(函數(shù))的對(duì)象。上海大學(xué) 雷電上海大學(xué) 雷電1.2 類(lèi)與抽象數(shù)據(jù)類(lèi)型如何發(fā)現(xiàn)對(duì)象,抽象出概念(類(lèi)型)?在我們?nèi)粘T~匯中的幾乎每一個(gè)名詞都表示一類(lèi)對(duì)象,具有一組屬性或行為特征 ,它是對(duì)現(xiàn)實(shí)世界的概括、分類(lèi)和抽象。一個(gè)類(lèi)是一種數(shù)據(jù)類(lèi)型,是面向?qū)ο笳Z(yǔ)言的基本模塊。對(duì)象(變量)是類(lèi)(數(shù)據(jù)類(lèi)型)的實(shí)例。建模-現(xiàn)實(shí)世界的虛擬化(感興趣方面的信息)介紹類(lèi)設(shè)計(jì):面向現(xiàn)實(shí)世界,抽象出所關(guān)心的對(duì)象的行為和屬性,定義其對(duì)象的類(lèi)型,從而封裝形成一個(gè)可復(fù)用的C+模塊 - 方法論.面向?qū)ο蠓椒▽W(xué)起源于面向?qū)ο蟪绦蛟O(shè)計(jì),是目前最符合人類(lèi)解決現(xiàn)實(shí)問(wèn)題的思維模式和物理系統(tǒng)運(yùn)行方式的軟件開(kāi)發(fā)方法學(xué)。特點(diǎn) 1) 以類(lèi)作為基本的軟

3、件構(gòu)件 類(lèi)是一群具有共同特征和行為的對(duì)象,其模型中,數(shù)據(jù)和對(duì)數(shù)據(jù)的操作(函數(shù))緊密結(jié)合。對(duì)象是一種包含了數(shù)據(jù)和行為(函數(shù)) ,并且良好封裝的邏輯實(shí)體。整個(gè)軟件由無(wú)數(shù)獨(dú)立活動(dòng)的對(duì)象構(gòu)成,對(duì)象之間通過(guò)消息機(jī)制相互通信和相互作用。與現(xiàn)實(shí)世界中的實(shí)際系統(tǒng)更加吻合,是軟件構(gòu)建思想上的一次革命。2)軟件定義和實(shí)現(xiàn)的統(tǒng)一整個(gè)軟件的開(kāi)發(fā)過(guò)程就是一次由粗到細(xì)構(gòu)建對(duì)象模型的過(guò)程,使用循環(huán)迭代的方式來(lái)開(kāi)發(fā)軟件,這既符合人類(lèi)對(duì)事物的認(rèn)識(shí)模式,又可以盡早獲得軟件開(kāi)發(fā)的概貌性結(jié)果,便于對(duì)軟件需求進(jìn)行驗(yàn)證。 3)重視軟件復(fù)用使用類(lèi)來(lái)完成對(duì)象的定義,類(lèi)還可以通過(guò)繼承派生出新的類(lèi),因此面向?qū)ο蠓椒▽W(xué)本質(zhì)上就具備了良好的軟件復(fù)用

4、的基礎(chǔ),可以在不同軟件中使用已有的類(lèi)來(lái)派生出新的類(lèi),既利用了前人的軟件開(kāi)發(fā)成果,又可以根據(jù)每個(gè)軟件的實(shí)際情況產(chǎn)生新的對(duì)象,結(jié)合對(duì)象完善的封裝機(jī)制,實(shí)現(xiàn)對(duì)象模型的多層次、普遍的復(fù)用。4)通過(guò)逐步演化來(lái)完成軟件開(kāi)發(fā)使用循環(huán)迭代的方式來(lái)開(kāi)發(fā)軟件,整個(gè)軟件系統(tǒng)是逐步精華的,這既符合人類(lèi)對(duì)事物的認(rèn)識(shí)模式,又可以盡早獲得軟件開(kāi)發(fā)的概貌性結(jié)果,便于對(duì)軟件需求進(jìn)行驗(yàn)證。 面向?qū)ο笤O(shè)計(jì)的C+語(yǔ)言描述classpublicprivateprotected成員變量(屬性)成員函數(shù)(方法)詞匯- C+語(yǔ)言如何支持類(lèi)的代碼設(shè)計(jì)和代碼實(shí)現(xiàn)?OOP 勢(shì)如破竹,近乎每一種最新推出的程序開(kāi)發(fā)工具或語(yǔ)言都采用了 OOP 思路;

5、面向?qū)ο缶幊?OOP 使用類(lèi):1)類(lèi)的實(shí)例化(創(chuàng)建對(duì)象).2)訪(fǎng)問(wèn)(操縱)其屬性和行為, 傳遞數(shù)據(jù)請(qǐng)求(調(diào)用)服務(wù)3)組件的集成組裝,對(duì)象間的通訊、交互對(duì)象人性化,在設(shè)計(jì)時(shí)盡可能把對(duì)象想象成絕頂聰明語(yǔ)法一: 類(lèi)的聲明格式class 類(lèi)名 public:protected:private:;例:class Personpublic:void setAge(int a);int getAge();private:int age;練習(xí)設(shè)計(jì)類(lèi):Student語(yǔ)法二: 實(shí)現(xiàn)類(lèi)內(nèi)聯(lián)式在類(lèi)中聲明函數(shù)的同時(shí)實(shí)現(xiàn)它.外聯(lián)式返回類(lèi)型 類(lèi)名:成員函數(shù)(參數(shù)表)函數(shù)體class Personpublic:void s

6、etAge(int age)this-age = age;int getAge()return age;private:int age; void Person :setAge(int a)age = a;int Person : getAge()return age;練習(xí)設(shè)計(jì)類(lèi):Student語(yǔ)法三:類(lèi)的實(shí)例化,創(chuàng)建對(duì)象類(lèi)是數(shù)據(jù)類(lèi)型!創(chuàng)建類(lèi)的實(shí)例(創(chuàng)建對(duì)象)生命期: 全局, 局部, 堆訪(fǎng)問(wèn)對(duì)象的成員.用 . 訪(fǎng)問(wèn)對(duì)象的成員用-訪(fǎng)問(wèn)所指對(duì)象的成員.Person gpn;int main( ) Person pn; Person *p2=new Person; pn.setAge(20); p2

7、-setAge(25);/delete p2;練習(xí)設(shè)計(jì)類(lèi):Student面向?qū)ο笤O(shè)計(jì)的3種視圖類(lèi)的定義中使用修飾符的目的是為了封裝性,簡(jiǎn)化了使用的難度。面向?qū)ο笤O(shè)計(jì)的三種視圖,如同收音機(jī):外部視圖:使用類(lèi)的對(duì)象者(使用收音機(jī)的人),只需關(guān)心收音機(jī)暴露的public的成員的使用方法,對(duì)象能做的工作(開(kāi)關(guān),調(diào)諧等收音機(jī)怎樣使用),而內(nèi)部的一切不必關(guān)心。內(nèi)部視圖:類(lèi)的擴(kuò)展者(對(duì)收音機(jī)改造的人),還要關(guān)心protected成員使用方法(內(nèi)部的可插拔件功能等),而其它private成員不必關(guān)心。內(nèi)部核心視圖:類(lèi)的設(shè)計(jì)者(收音機(jī)制造人),關(guān)心一切,必須知道完成一個(gè)任務(wù)的一切邏輯。封裝意味著對(duì)象內(nèi)部是如何工

8、作的對(duì)客戶(hù)端編程人員來(lái)說(shuō)是不可見(jiàn)的。如果沒(méi)有封裝性面對(duì)浩如煙海的數(shù)據(jù)或操作,哪能編程?聲明的可訪(fǎng)問(wèn)性public訪(fǎng)問(wèn)不受限制。protected訪(fǎng)問(wèn)僅限于當(dāng)前類(lèi)或從當(dāng)前類(lèi)派生出的類(lèi)。private訪(fǎng)問(wèn)僅限于當(dāng)前類(lèi)型。若不使用訪(fǎng)問(wèn)修飾符,其默認(rèn)的可訪(fǎng)問(wèn)性是: private 成員函數(shù)中如何訪(fǎng)問(wèn)本類(lèi)的成員? -內(nèi)部視圖中訪(fǎng)問(wèn)對(duì)象 注意:類(lèi)就是一種類(lèi)型,不是對(duì)象!在沒(méi)有創(chuàng)建對(duì)象時(shí),其成員變量在內(nèi)存中根本就沒(méi)有,所以成員函數(shù)中看待成員變量,如同C+函數(shù)中看待參變量,參變量在函數(shù)被調(diào)用時(shí)有確定的內(nèi)存并有值,成員變量在對(duì)象創(chuàng)建時(shí)有確定的內(nèi)存并有值,于是可以訪(fǎng)問(wèn)這樣的形式變量。在類(lèi)的成員函數(shù)中訪(fǎng)問(wèn)當(dāng)前類(lèi)的成

9、員,可直接訪(fǎng)問(wèn)。-在外部視圖中(客戶(hù)端)訪(fǎng)問(wèn)對(duì)象 類(lèi)是數(shù)據(jù)類(lèi)型!創(chuàng)建類(lèi)的實(shí)例(創(chuàng)建對(duì)象)生命期: 全局, 局部, 堆訪(fǎng)問(wèn)對(duì)象的成員.用 . 訪(fǎng)問(wèn)對(duì)象的成員用-訪(fǎng)問(wèn)所指對(duì)象的成員.例:繪圖軟件系統(tǒng)中的設(shè)計(jì) Point 屬性、行為/操作?那些信息暴露?隱蔽?Ex3_0練習(xí):設(shè)計(jì)Circle圓this 指針將函數(shù)也放在這個(gè)class包內(nèi),結(jié)構(gòu)就變成了新的創(chuàng)造物,它既能描述屬性(就像C中的struct 能做的一樣),又能描述行為,這就形成了對(duì)象的概念。對(duì)象是一個(gè)獨(dú)立的有約束的實(shí)體,有自己的記憶和活動(dòng)。class Pointpublic: int x; int y; void MoveTo(int X,

10、int Y) x=X; y=Y; void Draw( ); class Pointpublic: void MoveTo(int X,int Y) int x=X; int y=Y; void Draw( ); int x ,int y;class Pointpublic: void MoveTo(int X,int Y) x=X; y=Y; void Draw( ); Point pt; pt.MoveTo(10,20); pt.Draw( );對(duì)象的成員變量生命期與對(duì)象同在,能為所有成員函數(shù)共享.若有多個(gè)成員函數(shù)都要讀寫(xiě)一個(gè)變量,他應(yīng)該設(shè)計(jì)為成員變量.若一個(gè)類(lèi)有一個(gè)成員變量x,那么N個(gè)類(lèi)

11、的每個(gè)實(shí)例,內(nèi)存就有N個(gè)x變量.有N個(gè)成員函數(shù)嗎?this 指針N個(gè)類(lèi)的每個(gè)實(shí)例(變量)并不意味內(nèi)存有N個(gè)類(lèi)的成員函數(shù)。被產(chǎn)生的代碼幾乎和我們已經(jīng)為C 庫(kù)寫(xiě)的一樣高效。xyxyMoveTo()this-x,this-y內(nèi)存數(shù)據(jù)區(qū)代碼區(qū)對(duì)象1對(duì)象2類(lèi)的成員函數(shù)代碼對(duì)所有類(lèi)的對(duì)象是相同的,它如何知道訪(fǎng)問(wèn)實(shí)際對(duì)象的成員?系統(tǒng)隱藏地傳遞了this 指針給類(lèi)的非靜態(tài)成員函數(shù),它表示了實(shí)際對(duì)象的指針.在類(lèi)的非靜態(tài)成員函數(shù)中可以使用this 指針來(lái)訪(fǎng)問(wèn)類(lèi)的非靜態(tài)成員.this 指針不能被修改.3.2 示例:堆棧類(lèi)Stack 屬性特征: 是緩沖區(qū).最大緩存元素個(gè)數(shù)?屬性 : 數(shù)組行為特征:先進(jìn)后出行為: 元素

12、壓入、彈出元素stack.h3.3 效率和健壯性3.3.1 通過(guò)引用傳遞或返回對(duì)象P83 3-143.3.2 const 型的對(duì)象參數(shù)3.3.3 const 成員函數(shù)3.3.4 字符串參數(shù)P85 Ex3_1_1練習(xí)P85作業(yè):P126 3-1 Ex3_13.5 構(gòu)造函數(shù)和析構(gòu)函數(shù)3.5.1 構(gòu)造函數(shù)函數(shù)名同類(lèi)名,無(wú)返回類(lèi)型,其他同一般的成員函數(shù).總是被最先調(diào)用Ex: Stack3.5.11 析構(gòu)函數(shù)函數(shù)名:類(lèi)名,無(wú)返回類(lèi)型,無(wú)參數(shù),至多只能有一個(gè).總是被最后自動(dòng)調(diào)用一般在構(gòu)造函數(shù)中動(dòng)態(tài)分配內(nèi)存,在析構(gòu)函數(shù)中釋放其內(nèi)存。Ex: Stack(動(dòng)態(tài)分配實(shí)現(xiàn)的)3.5.2 對(duì)象數(shù)組與默認(rèn)構(gòu)造函數(shù)cla

13、ss C public: C( ) ;C c;C cs100;C *pcs=new C;帶參數(shù)的構(gòu)造函數(shù)class C public: C( ) C( int x, int y) ;構(gòu)造函數(shù)支持重載機(jī)制C c(1,2); /調(diào)帶參數(shù)的構(gòu)造函數(shù)C cs =C(1,1),C(2,2); C *pc=new C( ); /調(diào)默認(rèn)的構(gòu)造函數(shù)C *pc1=new C(2,3); /調(diào)帶參數(shù)的構(gòu)造函數(shù)若沒(méi)有定義任何構(gòu)造函數(shù)系統(tǒng)提供默認(rèn)構(gòu)造函數(shù),否則不會(huì)提供.3.5.7 轉(zhuǎn)型構(gòu)造函數(shù)如定義了: Person(string psn);于是可以隱式類(lèi)型轉(zhuǎn)換: Person wang=“wang wei”; 又如

14、: void func(Person psn)string wang= “wang wei”; func(wang);而 explicit Person(string psn);可阻止這種轉(zhuǎn)換,只能 Person wang(“wang wei”);例:Ex3_43.5.4 拷貝構(gòu)造函數(shù)創(chuàng)建對(duì)象問(wèn)題,如:Person psn2=psn1; 或 Person psn2(psn1); 編譯器自動(dòng)提供的拷貝拷貝構(gòu)造函數(shù)是對(duì)數(shù)據(jù)成員逐一拷貝.當(dāng)類(lèi)Person 中某個(gè)成員是指針,那么對(duì)象psn2、psn1不再是完全獨(dú)立的實(shí)體.例:例:Ex3_4缺省下數(shù)據(jù)成員逐一拷貝將造成三個(gè)錯(cuò)誤:1. 對(duì)象拷貝時(shí),原有的

15、p沒(méi)有釋放就修改到指向另一個(gè)內(nèi)存區(qū)。2. 兩對(duì)象的p指向同一個(gè)內(nèi)存區(qū),相互影響。3.在對(duì)象被析構(gòu)時(shí),p 被釋放了兩次。為了避免指針值的拷貝,需要自定義拷貝構(gòu)造函數(shù):其設(shè)計(jì)方法如:class Person public:Person(Person &psn);Person(const Person &psn);注意:拷貝構(gòu)造函數(shù)的參數(shù)卻必須是引用于是創(chuàng)建對(duì)象:Person psn2(psn1); /觸發(fā)拷貝構(gòu)造函數(shù)的調(diào)用。Person psn2=psn1; /觸發(fā)拷貝構(gòu)造函數(shù)的調(diào)用。Person psn3;psn3=psn1; /缺省仍為數(shù)據(jù)逐一拷貝賦值,要避免此,應(yīng)提供對(duì)=操作的重載。例:p9

16、6 namelist.cpp不要輕視拷貝構(gòu)造函數(shù)與賦值函數(shù)3.5.9 構(gòu)造函數(shù)的初始化段class C .;int x; int y;public:C (int a): x(a),y(0);3.5.10 構(gòu)造函數(shù)與new delete析構(gòu)造函數(shù)順序:Ex3_353.4 實(shí)例 時(shí)間標(biāo)記類(lèi)TimeStamp需求:解析時(shí)間字符串,GetDate、GetTimeSYSTEMTIMEGetLocalTimememcpysprintfsscanf例:TimeEx3.7 靜態(tài)成員訪(fǎng)問(wèn)方法同非靜態(tài)成員,還可以通過(guò)作用域分辨符.他們是屬于類(lèi)的,而不是屬于對(duì)象的.Ex3_37靜態(tài)成員變量具有全局生命期,外部連接屬

17、性,要通過(guò)作用域分辨符在外部創(chuàng)建實(shí)例.類(lèi)的所有實(shí)例共享其靜態(tài)數(shù)據(jù)成員.靜態(tài)函數(shù)靜態(tài)函數(shù)中不能訪(fǎng)問(wèn)非靜態(tài)成員,因?yàn)闆](méi)有this指針struct 和 classC+中: struct 和 class相同,但struct中的所有成員都是公有的.C/C+語(yǔ)言的面向?qū)ο笤O(shè)計(jì)方法struct SObj int v;void m(SObj *pobj,int a) pobj-v =a;class CObj int v;Public: void m(int a);void CObj:m(int a) this-v=a;int main() SObj obj1; m(&obj1,0); CObj obj2; o

18、bj2-m(0); int d=sizeof(SOj)-izeof(CObj);變量成員變量局部變量全局變量靜態(tài)變量自動(dòng)對(duì)象堆對(duì)象int a;class Cint a;void func(int a ) static int s=0;int *p=new int10;可見(jiàn)性,生命期?函數(shù)成員函數(shù)靜態(tài)成員函數(shù)全局函數(shù)編程作業(yè):P128 3-15設(shè)計(jì)要點(diǎn):1)封裝.2)服務(wù)DataSet類(lèi)成員1)DataTable * newTable(string tableName);功能: 創(chuàng)建表參數(shù): tableName: in 要?jiǎng)?chuàng)建的表名.返回:成功:返回創(chuàng)建的表對(duì)象地址失敗:返回NULL? Data

19、Table newTable(string tableName); ? DataTable & newTable(string tableName); ? bool newTable(string tableName, DataTable &table);? bool newTable(string tableName, DataTable *ptable);? int newTable(string tableName, DataTable *pptable); ? bool newTable(string tableName, DataTable *& ptable); 2)void printTable( string tableName);功能: 打印表DataTable1)void setColumns( string columns

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論