版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1,第9章 從結(jié)構(gòu)化程序設(shè)計到面向?qū)ο蟮某绦蛟O(shè)計,北京交通大學(xué)計算機學(xué)院 計算機程序設(shè)計基礎(chǔ)課程組,2,教學(xué)目標(biāo),了解C+對C的擴充和改進 掌握面向?qū)ο蟪绦蛟O(shè)計的基本思想和方法 掌握面向?qū)ο蟮母拍?理解面向?qū)ο蟪绦蛟O(shè)計的特性,3,9.1 C+對C的改進和擴充 9.2 面向?qū)ο蟪绦蛟O(shè)計方法 9.2.1 面向?qū)ο蟾拍?9.2.2 類和對象 9.2.3 面向?qū)ο蟪绦蛟O(shè)計的特性,4,9.1.1 輸入輸出流,scanf和printf輸入輸出的缺陷 輸入輸出流的概念: 輸入輸出是以字節(jié)流的形式實現(xiàn)的,流實際上是一個字節(jié)序列。 在輸入操作中,字節(jié)從輸入設(shè)備流向內(nèi)存;輸出操作中,字節(jié)從內(nèi)存流向輸出設(shè)備。 流是
2、一個抽象的概念,實際進行輸入輸出時,流通常都是和某種具體的物理設(shè)備聯(lián)系起來。鍵盤和顯示器是計算機的標(biāo)準(zhǔn)輸入輸出設(shè)備,數(shù)據(jù)從鍵盤或磁盤文件流入內(nèi)存的操作稱為提取操作,數(shù)據(jù)從內(nèi)存流向屏幕或磁盤文件稱為插入操作。,9.1 C+對C的改進和擴充,5,用cout進行輸出 用cout進行輸出時必須與預(yù)定義的插入符 void main() int i = 10; float j = 8.5; char *str = Windows!; cout i= i endl; cout j= j endl; cout str= str endl; ,9.1 C+對C的改進和擴充,6,用cin進行輸入 用cin進行輸入
3、時必須與預(yù)定義的提取符一起使用,輸入時不用指定數(shù)據(jù)類型,也可以使用多個提取符,將鍵盤輸入的數(shù)據(jù)送到輸入流cin中,然后存到內(nèi)存。 #include void main() /*主函數(shù)*/ int i1 , i2 , sum; /*變量定義*/ cout i1 i2; /*輸入數(shù)據(jù)*/ sum = i1 + i2; /*計算i1,i2的和*/ cout sum= sum endl; /*輸出sum的值*/ ,9.1 C+對C的改進和擴充,7,1、重載的需要性 在C中,每個函數(shù)需要唯一的名字,例如,求兩個數(shù)中較大的數(shù),對于不同類型需要不同的名字: int imax(int ,int ); floa
4、t fmax(float,float); double dmax(double,double); 函數(shù)的重載:即建立多個同名函數(shù),但每個函數(shù)的參數(shù)個數(shù)或類型不同,系統(tǒng)根據(jù)參數(shù)個數(shù)和類型決定調(diào)用哪個函數(shù)。例如,將上面三個函數(shù)的聲明改為: int max(int ,int ); float max(float,float); double max(double,double);,9.1 C+對C的改進和擴充,9.1.2 函數(shù)的重載,8,2、使用說明 僅返回類型不同,但函數(shù)名和形參都相同,則是非法的,如: int fun(int a,int b); long fun(int a,int b); 同名
5、函數(shù)應(yīng)該具有相同的功能,僅數(shù)據(jù)類型不同而已,否則可讀性受破壞 當(dāng)重載函數(shù)有默認參數(shù)時,應(yīng)避免二義性 int fun(int a,b=0); int fun(int a); /error,9.1 C+對C的改進和擴充,9,【例9-4】參數(shù)類型上不同的重載函數(shù) #include int add(int , int); double add(double , double); void main() cout add( 5 , 10 ) endl; cout add( 5.6 , 10.2 ) endl; int add(int x , int y) return x + y; double add
6、(double x , double y) return x + y; ,9.1 C+對C的改進和擴充,10,【例9-5】參數(shù)個數(shù)上不同的重載函數(shù) #include int min( int a , int b ); int min( int a , int b , int c ); void main() cout min( -2 , 8 ) endl; cout min( 3 , 5 , 4 ) endl; int min( int a , int b ) return a b ? a : b; int min( int a , int b , int c ) int t = min( a
7、 , b ); return min( t , c ); ,9.1 C+對C的改進和擴充,11,9.1.3 帶默認參數(shù)的函數(shù),函數(shù)定義時給一個或多個參數(shù)指定默認值,調(diào)用時,如果省略參數(shù),自動按默認值傳遞。 1. 默認參數(shù)的聲明 (1)當(dāng)有函數(shù)聲明時 void point(int x=3,int y=4) /聲明中給出默認值 void point(int x,int y) /定義中不允許給出默認值 coutxyendl; (2)沒有函數(shù)聲明時,在定義函數(shù)中給出默認值 2. 默認參數(shù)的順序規(guī)定 默認參數(shù)必須是最右邊的參數(shù),即一個指定了默認值參數(shù)的右邊,不能出現(xiàn)沒有指定的默認參數(shù)。 void fun
8、(int a=1,int b,int c=3); /error void fun(int a,int b=2,int c=3); /ok,9.1 C+對C的改進和擴充,12,【例9-6】 使用默認參數(shù)計算立方體體積 #include int volume(int length,int width=10,int height=20) void main() int l(50),w(40),h(30),area; area=volume(l,w,h); cout“The area of cube equal:t”areaendl; area=volume(l,w); cout“The area o
9、f cube equal:t”areaendl; area=volume(l); cout“The area of cube equal:t”areaendl; int volume(int length,int width,int height) return length*width*height; ,13,9.1.4 內(nèi)聯(lián)函數(shù),1.內(nèi)聯(lián)函數(shù)的需要性 #include int isnumber(char); /函數(shù)聲明 void main() char c; while(c=cin.get()!=n) if( isnumber(c) ) /調(diào)用一個小函數(shù) cout =0 ,9.1 C+對C
10、的改進和擴充,14,2. 解決辦法 限定符inline用于函數(shù)定義,稱為內(nèi)聯(lián)函數(shù)。將isnumber()函數(shù)聲明為inline,即在函數(shù)聲明和定義中: inline int isnumber(char); /inline不能少 void main() / inline int isnumber(char c) return (ch=0 3.內(nèi)聯(lián)函數(shù)的函數(shù)體限制: inline用于經(jīng)常用的小函數(shù)(15行) 內(nèi)聯(lián)函數(shù)內(nèi)不能使用循環(huán)和開關(guān)語句 遞歸函數(shù)不能做內(nèi)聯(lián)函數(shù),9.1 C+對C的改進和擴充,15,9.1.5 一元作用域運算符(:),用:在同名局部變量作用域中訪問全局變量 #include do
11、uble n=5; int main() float n=8; cout Local float value of n = n nGlobal double value of n = :n endl; return 0; ,結(jié)果: Local float value of n = 8 Global double value of n =5,9.1 C+對C的改進和擴充,16,9.1.6 引用與函數(shù),1. 引用的概念 引用是別名,聲明引用的過程就是給某個變量建立別名的過程。一般形式為: 數(shù)據(jù)類型 說明: 程序找引用的地址,只能找到所引用目標(biāo)的地址 引用一旦初始化,它就維系在一定的目標(biāo)上不在分開,
12、9.1 C+對C的改進和擴充,17,【例9-7】 聲明和使用引用 #include void main() int num1 = 2; int ,運行結(jié)果: num1=2 rNum=2 num1=5 num2=5 rNum=5 public: void print() cout name void printname() cout name; ; class course char cname20; public: void print() cout cname ;,void f1(student P) P.printname(); P.print(); /向同一個對象發(fā)送不同的消息 void
13、 f2(student P,course C) P.print(); C.print(); /向不同對象發(fā)送相同的消息 ,9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,2消息(Message) 一個對象是獨立存在的模塊,通過消息激活機制可以把對象動態(tài)連接起來。所謂消息指的是用來請求對象執(zhí)行某一處理或回答某些信息的要求。所謂發(fā)送消息,實際指的是一次函數(shù)調(diào)用。,26,9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,3類(Class) 類是對一組對象的抽象,它將該組對象具有的共同特征集中起來,以說明該組對象的能力和性質(zhì)。因此,具有相似的屬性和行為的一組對象就可以抽象為類。 例如,學(xué)籍管理系統(tǒng)中,張三和李四都是學(xué)生對象,都有學(xué)號、
14、姓名、系別、住址、選修學(xué)分等屬性,都能將進行注冊、退學(xué)、年級變更、轉(zhuǎn)系、地址變更和修改學(xué)分等操作,因此,可以將所有同學(xué)抽象為一個類學(xué)生類。 類是所有具有共同特征的對象的抽象,是一個抽象的概念;而對象是一個類中某個具體的實體,稱為類的實例(Instance)。類和實例的關(guān)系,是抽象和具體的關(guān)系,對象是程序執(zhí)行過程中由所屬的類動態(tài)生成的。,27,9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,例如,定義學(xué)生類如下: 對象類:學(xué)生(Student) 屬性:學(xué)號(StudentNo) 姓名(Name) 系別(Department) 住址(Address) 選修學(xué)分(Credit) 方法:注冊(Enroll) 退學(xué)(D
15、rop) 年級變更(ChangeLevel) 轉(zhuǎn)系(ChangeDept) 地址變更 (ChangeAddress) 修改學(xué)分(ChangeCredit),28,9.2.3 面向?qū)ο蟪绦蛟O(shè)計特性,1.封裝和數(shù)據(jù)隱藏(Encapsulation) 封裝是一種信息隱蔽技術(shù),指的是將一個數(shù)據(jù)和與這個數(shù)據(jù)有關(guān)的操作集合放在一起形成對象,用戶只能見到對象封裝界面上的信息,對象內(nèi)部對用戶是隱蔽的。 封裝的目的:將設(shè)計者和使用者分開。使用者不必知道對象行為的細節(jié),只需要使用設(shè)計者提供的協(xié)議命令對象去做即可。 私有數(shù)據(jù)修改的方法:數(shù)據(jù)隱藏技術(shù)使對象內(nèi)部的屬性只能由該對象自己的方法進行修改,外界不能訪問,外界只
16、能通過對象提供的接口去訪問這些屬性,從而有效避免外界的錯誤對該對象的影響。,9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,29,2繼承性(Inheritance) 如果有幾個類有公共的屬性或方法,最好創(chuàng)建一個包含這些公共內(nèi)容的新類來避免重復(fù),歸類的結(jié)果是逐步抽象的過程;反之,對于復(fù)雜的類最好劃分為幾個更特殊的類,層層分類,是概念逐步細化的過程。 面向?qū)ο蟪绦蛟O(shè)計中允許用已有的類通過繼承的方式創(chuàng)建新類,繼承性是自動地共享類、子類和對象中的方法和數(shù)據(jù)的機制。新類稱為派生類(dervied class)或子類(subclass),已有類稱為基類(base class)或父類(superclass),子類繼承父類的
17、全部方法和屬性。,9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,30,例如,要定義一個新類研究生類,由于研究生也是學(xué)生,具有Student的全部屬性,還有Student類沒有的導(dǎo)師等屬性,可以根據(jù)已有的Student類派生。 對象類:研究生(Graduate) 父類:學(xué)生(Student) 屬性: 學(xué)位(Program) 導(dǎo)師(Advisor) 在職否(Occupation) 方法: 學(xué)位變更(ChangeProgram) 導(dǎo)師變更(ChangeAdvisor) 狀態(tài)變更 (ChangeOccupation),9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,31,繼承是可以傳遞的,繼承可以使我們用一種簡單的方法描述事物。下
18、面是魚類的繼承層次結(jié)構(gòu):,9.2 面向?qū)ο蟮某绦蛟O(shè)計方法,32,3多態(tài)性(Polymorphism) 多態(tài)性:指發(fā)出同樣的消息被不同類型的對象接收時導(dǎo)致完全不同的行為。發(fā)送消息即函數(shù)調(diào)用,不同的行為指不同的實現(xiàn)。在多個類中可能會存在一些名字相同,但實現(xiàn)過程和功能不同的方法,如: void f2(student P,course C) P.print(); C.print(); /向不同對象發(fā)送相同的消息 P.print()向?qū)ο驪發(fā)送了一個print()消息,結(jié)果調(diào)用Student類的print()函數(shù)打印出學(xué)生的名字。C.print()向?qū)ο驝發(fā)送了一個print()消息,結(jié)果調(diào)用Course類的print()函數(shù)打印出課程的名字。同樣一個消息print(),被不同
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年四川城市職業(yè)學(xué)院單招職業(yè)技能考試參考題庫附答案詳解
- 2026中國聯(lián)通博州分公司招聘10人(新疆)考試備考試題及答案解析
- 2026年2月重慶萬州區(qū)周家壩街道公益性崗位招聘1人筆試模擬試題及答案解析
- 2026年金華義烏市中心醫(yī)院醫(yī)共體上溪院區(qū)招聘協(xié)議工作人員2人考試參考題庫及答案解析
- 2026廣東江門市臺山市市場監(jiān)督管理局招聘編外人員1人考試備考試題及答案解析
- 2026年甘肅警察學(xué)院引進高層次人才16人考試參考試題及答案解析
- 2026年廣西生態(tài)工程職業(yè)技術(shù)學(xué)院單招職業(yè)技能筆試模擬試題帶答案解析
- 護理體位擺放的培訓(xùn)與認證
- 2026年武漢大學(xué)中南醫(yī)院勞務(wù)派遣制科研秘書招聘備考題庫及完整答案詳解1套
- 2026年首都醫(yī)科大學(xué)附屬北京安貞醫(yī)院科技處科研管理人才招聘備考題庫及一套完整答案詳解
- T-CDLDSA 09-2025 健身龍舞彩帶龍 龍舞華夏推廣套路技術(shù)規(guī)范
- 部編版初三化學(xué)上冊期末真題試題含解析及答案
- GB/T 19566-2025旱地糖料甘蔗高產(chǎn)栽培技術(shù)規(guī)程
- 去極端化條例解讀課件
- 光纖收發(fā)器培訓(xùn)
- 汽車減震器課件
- 水上拋石應(yīng)急預(yù)案
- 蘇州大學(xué)介紹
- 招標(biāo)公司勞動合同范本
- 酒店消防安全應(yīng)急預(yù)案范本
- 輻射與安全培訓(xùn)北京課件
評論
0/150
提交評論