C++程序設(shè)計課件.ppt_第1頁
C++程序設(shè)計課件.ppt_第2頁
C++程序設(shè)計課件.ppt_第3頁
C++程序設(shè)計課件.ppt_第4頁
C++程序設(shè)計課件.ppt_第5頁
已閱讀5頁,還剩50頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第8章 類和對象 第9章 關(guān)于類和對象的進一步討論 第10章 運算符重載,第3篇基于對象的程序設(shè)計,第8章 類和對象,8.1 面向?qū)ο蟪绦蛟O(shè)計方法概述 8.2 類的聲明和對象的定義 8.3 類的成員函數(shù) 8.4 對象成員的引用 8.5 類的封裝性和信息隱蔽 8.6 類和對象的簡單應(yīng)用舉例,面向過程的編程思想:,傳統(tǒng)的面向過程程序設(shè)計是圍繞功能進行的,用一個函數(shù)實現(xiàn)一個功能。一個函數(shù)可以使用和修改任何一組共用數(shù)據(jù)。,因此,當(dāng)程序規(guī)模較大時,無論是管理還是調(diào)試都顯得力不從心。解決辦法:面向?qū)ο蟪绦蛟O(shè)計方法。,面向?qū)ο蟪绦蛟O(shè)計:把同一對象的數(shù)據(jù)和操作封裝在一起。,例如:人們生產(chǎn)汽車時,發(fā)動機、底盤、

2、車身和輪子分別由不同生產(chǎn)廠商設(shè)計和制造,最后由汽車制造商組裝在一起。在組裝時,各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作,各部分內(nèi)部如何工作一無所知。 這就是面向?qū)ο蟮某绦蛟O(shè)計的基本思路。 為了進一步說明問題,下面先討論幾個有關(guān)的概念。,1. 對象 客觀世界中任何一個事物都可以看成一個對象。 對象可大可小。對象是構(gòu)成系統(tǒng)的基本單位。 對象的兩個要素:屬性和行為。 屬性:對象的特征,定義成員變量描述。 行為:對象的動作,定義成員函數(shù)完成。,要使某一個對象實現(xiàn)某一種行為(即操作),應(yīng)當(dāng)向它傳送相應(yīng)的消息。即調(diào)用該對象相應(yīng)的成員函數(shù)。,每一個實體都是對象。有一些對象是具有相同的結(jié)構(gòu)和特性的。每個對象都屬于

3、一個特定的類型。 在C+中對象的類型稱為類(class)。類代表了某一批對象的共性和特征。 類是對象的抽象,而對象是類的具體實例(instance)。,2、類,如:10個不同尺寸的三角形是10個對象。這10個三角形對象有相同的屬性和行為,可以將它們抽象為一種類型,稱為三角形類型。,3. 封裝與信息隱蔽 封裝:將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨立,互不干擾。 信息隱蔽:將對象中某些部分對外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留少量接口,以便與外界聯(lián)系,接收外界的消息。 信息隱蔽有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。,4. 繼承與派生,代碼重用;繼承了共性,又

4、派生出自己的各自的特性。,動 物,貓,狗,學(xué) 生,成教學(xué)生,機械專業(yè),法律專業(yè),網(wǎng)絡(luò)專業(yè),軟職學(xué)生,軟件專業(yè),5. 多態(tài)性 由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會作出不同的響應(yīng)。 如:動物都會叫,但不同的動物的叫聲不同。 如:在Windows環(huán)境下,用鼠標(biāo)雙擊一個文件對象(這就是向?qū)ο髠魉鸵粋€消息),根據(jù)文件對象的不同,將做不同的操作。如果是可執(zhí)行文件,則會執(zhí)行此程序;如果是文本文件,則啟動文本編輯器并打開該文件。,隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十分復(fù)雜。需要規(guī)范整個軟件開發(fā)過程,明確軟件開發(fā)過程中每個階段的任務(wù),在保證前一個階段工作的正確性的情況下,再進行下一階段的工作

5、。這就是軟件工程學(xué)需要研究和解決的問題。 面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分:,8.1.4 面向?qū)ο蟮能浖_發(fā),1. 面向?qū)ο蠓治?object oriented analysis,OOA) 軟件工程中的系統(tǒng)分析階段,系統(tǒng)分析員要和用戶結(jié)合在一起,對用戶的需求作出精確的分析和明確的描述,從宏觀的角度概括出系統(tǒng)應(yīng)該做什么(而不是怎么做)。面向?qū)ο蟮姆治?,要按照面向?qū)ο蟮母拍詈头椒?,在對任?wù)的分析中,從客觀存在的事物和事物之間的關(guān)系,歸納出有關(guān)的對象(包括對象的屬性和行為)以及對象之間的聯(lián)系,并將具有相同屬性和行為的對象用一個類(class)來表示。建立一個能反映真實工作情況的需求模型。,2. 面

6、向?qū)ο笤O(shè)計(object oriented design,OOD) 根據(jù)面向?qū)ο蠓治鲭A段形成的需求模型,對每一部分分別進行具體的設(shè)計,首先是進行類的設(shè)計,類的設(shè)計可能包含多個層次(利用繼承與派生)。然后以這些類為基礎(chǔ)提出程序設(shè)計的思路和方法,包括對算法的設(shè)計。在設(shè)計階段,并不牽涉某一種具體的計算機語言,而是用一種更通用的描述工具(如偽代碼或流程圖)來描述。 3. 面向?qū)ο缶幊?OOP) 根據(jù)面向?qū)ο笤O(shè)計的結(jié)果,用一種計算機語言把它寫成程序,顯然應(yīng)當(dāng)選用面向?qū)ο蟮挠嬎銠C語言(例如C+),否則無法實現(xiàn)面向?qū)ο笤O(shè)計的要求。,4. 面向?qū)ο鬁y試(object oriented test,OOT) 在寫

7、好程序后交給用戶使用前,必須對程序進行嚴(yán)格的測試。測試的目的是發(fā)現(xiàn)程序中的錯誤并改正它。面向?qū)ο鬁y試是用面向?qū)ο蟮姆椒ㄟM行測試,以類作為測試的基本單元。 5. 面向?qū)ο缶S護(object oriented soft maintenance,OOSM) 因為對象的封裝性,修改一個對象對其他對象影響很小。利用面向?qū)ο蟮姆椒ňS護程序,大大提高了軟件維護的效率。,類是對象的抽象,而對象是類的具體實例(instance)。,8.2 類的聲明和對象的定義 8.2.1 類和對象的關(guān)系,抽象:從眾多物理對象中抽取最本質(zhì)的特征加以描述,而忽略次要的和非本質(zhì)的特征。主要針對實體的屬性(特征)和行為(動作)進行抽象

8、。,實體,屬性,行為,現(xiàn)實世界,抽象,軟件,C+類名,(數(shù)據(jù),數(shù)據(jù),),(函數(shù),函數(shù),),private:,public:,以一個學(xué)生實體為例:,學(xué)生,學(xué)號,姓名, 專業(yè),現(xiàn)實世界,抽象,C+類名,private: id name major,public: registerFor pickMajor,注冊,選專業(yè), 交學(xué)費,封裝和數(shù)據(jù)隱藏,接 口,對象行為(函數(shù)),對象屬性(數(shù)據(jù)),可見,隱藏,8.2 類的聲明和對象的定義,在C+中先聲明一個類類型,然后用它去定義若干個同類型的對象。 對象是類類型的一個變量。類是對象的模板,是用來定義對象的一種抽象類型。 類是抽象的,不占用內(nèi)存,而對象是具體

9、的,占用存儲空間。,8.2.2 聲明類類型,類類型的聲明,一般形式為: class 類名 private: 私有的數(shù)據(jù)和成員函數(shù); public: 公用的數(shù)據(jù)和成員函數(shù); ;,public部分和private部分放在類體的前后沒有規(guī)定。但public部分在前面,可以使用戶將注意力集中在能被外界調(diào)用的成員上,思路更清晰一些。,成員訪問限定符有效范圍是到另一個訪問限定符為止,共有以下幾類: private:不能被類外訪問,也不能被派生類的成員函數(shù)訪問。 public:能被類外訪問,也可以被派生類的成員函數(shù)訪問。 protected:不能被類外訪問,但可以被派生類的成員函數(shù)訪問。,class Stu

10、dent /以class開頭 int id; char name20; char major20; void registerFor( ) cin id name major fees; ;,沒有訪問限定符默認(rèn)為私有成員,因此該類沒有與外界的接口。,不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起來,而把成員函數(shù)作為對外界的接口。 可以將上面類的聲明改為: class Student private: int id; char name20; char major20; public: void registerFor( ) cin id name major fees; ;,8.2.3 定

11、義對象的方法,private: id name major,public: registerFor pickMajor,Student類,對象stu1,0521140 張三 Computer registerFor pickMajor,對象stu1,0522240 李四 Network registerFor pickMajor,1. 先聲明類類型,然后再定義對象,聲明了類類型后,定義對象有兩種形式。 (1) class 類名 對象名 class Student stud1, stud2; 把class和Student合起來作為一個類名,用來定義對象。 (2) 類名 對象名 Student s

12、tud1,stud2; 直接用類名定義對象。這兩種方法是等效的。,2. 在聲明類類型的同時定義對象 class Student private: int id; char name20; char major20; public: void registerFor( ) cin id name major fees; stud1,stud2; /定義了兩個Student類的對象 在定義Student類的同時,定義了兩個Student 類的對象。,3. 不出現(xiàn)類名,直接定義對象 class /無類名 private: /聲明以下部分為私有的 . public: /聲明以下部分為公用的 . stu

13、d1, stud2; /定義了兩個無類名的類對象 這種方法很少用。在實際的程序開發(fā)中,一般都采用第1種方法。 在定義一個對象時,編譯系統(tǒng)會為這個對象分配存儲空間,以存放對象中的成員。,類的成員函數(shù)與一般函數(shù)的區(qū)別只是: 它是屬于一個類的成員,出現(xiàn)在類體中。可以指定為private、 public、protected 成員函數(shù)可以訪問本類中任何成員(包括私有和公用數(shù)據(jù)和函數(shù)成員) 。,8.3 類的成員函數(shù) 8.3.1 成員函數(shù)的性質(zhì),一般將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對外接口。 不被外界調(diào)用的,而只是為本類中的成員函數(shù)所調(diào)用的函數(shù),應(yīng)指定為private。這種函數(shù)的作用

14、是支持其他函數(shù)的操作,是類中其他成員的工具函數(shù)(utility function),類外用戶不能調(diào)用這些私有的工具函數(shù)。,成員函數(shù)在類體中只寫成員函數(shù)的聲明,而在類的外面進行函數(shù)定義。如 :,8.3.2 在類外定義成員函數(shù),class Student private: int id; char name20; char major20; public: void registerFor( ) ; ;,void Student : registerFor( ) cin id name major; ,注意: 類體中定義函數(shù)時,不需要在函數(shù)名前面加上類名,因為函數(shù)屬于哪一個類是不言而喻的。 成員函

15、數(shù)在類外定義時,必須在函數(shù)名前面加上類名,予以限定(qualifed),“”是作用域限定符(field qualifier)或稱作用域運算符,用它聲明函數(shù)是屬于哪個類的。,類體中作原型聲明,然后在類外定義,類體的位置應(yīng)在函數(shù)定義之前,否則編譯時會出錯。 在類的內(nèi)部對成員函數(shù)作聲明,而在類體外定義成員函數(shù),這是程序設(shè)計的一種良好習(xí)慣。,如果在作用域運算符“”的前面沒有類名,或者函數(shù)名前面既無類名又無作用域運算符“”,如 display( ) 或 display( ) 則表示display函數(shù)不屬于任何類,這個函數(shù)不是成員函數(shù),而是全局函數(shù),即一般普通函數(shù)。,成員函數(shù)還可以是:,3、內(nèi)置函數(shù);,1

16、、帶缺省值的函數(shù);,2、重載函數(shù);,1、帶缺省值的函數(shù) void Time:setdata(int h=0, int m=0, int s=0) ,2、重載函數(shù) void Time:setdata() void Time:setdata(int h, int m, int s) ,3、內(nèi)置函數(shù) 為了提高運行效率,對于較簡單的函數(shù)可以聲明為內(nèi)置成員函數(shù)。 內(nèi)置成員函數(shù)不能有復(fù)雜的結(jié)構(gòu)(如循環(huán)結(jié)構(gòu)、switch結(jié)構(gòu)) 在類中聲明內(nèi)置函數(shù)的方法為: 1、將函數(shù)體放在類中聲明隱式聲明; 2、使用inline顯示聲明;,class Time public: void setdata( ) cin hou

17、r minute second; private: int hour; int minute; int second; ;,內(nèi)置函數(shù)的隱式聲明:,class Time public: inline void setdata( ); private: int hour; int minute; int second; ; inline void setdata( ) cin hour minute second;,內(nèi)置函數(shù)的顯式聲明:,不利于類聲明和成員函數(shù)定義的分離,8.3.4 成員函數(shù)的存儲方式,用一段空間存放共同的函數(shù)代碼段,在調(diào)用各對象的函數(shù)時,都去調(diào)用這個公用的函數(shù)代碼。,每個對象占用

18、的存儲空間只是該對象的數(shù)據(jù)部分所占用的存儲空間,而不包括函數(shù)代碼所占用的存儲空間。,class Time int hour; int minute; int sec; public: void set( ) cin hour minute sec; ; 一個對象所占的空間大小只取決于該對象中數(shù)據(jù)成員所占的空間,而與成員函數(shù)無關(guān)。函數(shù)代碼是存儲在對象空間之外的。,該類對象所占用的字節(jié)數(shù): cout sizeof(Time) endl; 輸出的值是12。,不同的對象使用的是同一個函數(shù)代碼段,它怎么能夠分別對不同對象中的數(shù)據(jù)進行操作呢? C+專門設(shè)立了一個名為this的指針,用來指向不同的對象。 需

19、要說明: (1) 不論成員函數(shù)在類內(nèi)定義還是在類外定義,成員函數(shù)的代碼段都用同一種方式存儲。 (2) 不要將成員函數(shù)的這種存儲方式和inline(內(nèi)置)函數(shù)的概念混淆。,在程序中經(jīng)常需要訪問對象中的成員。訪問對象中的成員可以有3種方法: 通過對象名和成員運算符訪問對象中的成員; 通過指向?qū)ο蟮闹羔樤L問對象中的成員; 通過對象的引用變量訪問對象中的成員。,8.4 對象成員的引用,訪問對象中成員的一般形式: 對象名.成員名 不僅可以在類外引用對象的公用數(shù)據(jù)成員,而且還可以調(diào)用對象的公用成員函數(shù),但同樣必須指出對象名,如 stud1. registerFor( ) ; /正確,調(diào)用對象stud1的公

20、用成員函數(shù) registerFor( ); /錯誤,沒有指明是哪一個對象的registerFor函數(shù) 由于沒有指明對象名,編譯時把registerFor( )作為普通函數(shù)處理。,8.4.1 通過對象名和成員運算符訪問對象中的成員,只能訪問public成員,而不能訪問private成員,如果已定義id為私有數(shù)據(jù)成員,下面的語句是錯誤的: stud1.id=10101; /num是私有數(shù)據(jù)成員,不能被外界引用 在類外只能調(diào)用公用的成員函數(shù)。在一個類中應(yīng)當(dāng)至少有一個公用的成員函數(shù),作為對外的接口,否則就無法對對象進行任何操作。,如果有以下程序段: class Time public: /數(shù)據(jù)成員是公

21、用的 int hour; int minute; ; Time t,*p; /定義對象t和指針變量p p= /輸出p指向的對象中的成員hour 在p指向t的前提下,p-hour,(*p).hour和t.hour三者等價。,8.4.2 通過指向?qū)ο蟮闹羔樤L問對象中的成員,如果已聲明了Time類,并有以下定義語句: Time t1; /定義對象t1 Time /輸出對象t1中的成員hour t2與t1共占同一段存儲單元(即t2是t1的別名),因此t2.hour就是t1.hour。,8.4.3 通過對象的引用變量來訪問對象中的成員,例:需要求三個長方柱的體積,請編寫一個基于對象的程序,數(shù)據(jù)成員包括length(長)、width(寬)、height(高)。 要求用成員函數(shù)實現(xiàn)以下功能: (1)、由

溫馨提示

  • 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

提交評論