面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象_第5頁(yè)
已閱讀5頁(yè),還剩51頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

關(guān)于面向?qū)ο蟪绦蛟O(shè)計(jì)之類(lèi)和對(duì)象第1頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是面向?qū)ο蟮某绦蛟O(shè)計(jì)? 面向?qū)ο蟮某绦蛟O(shè)計(jì)(Object-OrientedProgramming

)和傳統(tǒng)的結(jié)構(gòu)化程序設(shè)計(jì)的思路完全不同。面向?qū)ο蟮某绦蛟O(shè)計(jì)和人們?nèi)粘I罱鉀Q問(wèn)題的思路是相似的。比如,我們生產(chǎn)汽車(chē)時(shí),不是順序制造發(fā)動(dòng)機(jī),在設(shè)計(jì)制造底盤(pán)、車(chē)身、輪子。而是分別設(shè)計(jì)制造發(fā)動(dòng)機(jī)、底盤(pán)、車(chē)身和輪子,最后組裝在一起。組裝時(shí),各部件之間有聯(lián)系,以便協(xié)調(diào)工作。例如,司機(jī)踩油門(mén),就能調(diào)節(jié)油路,控制發(fā)動(dòng)機(jī)的轉(zhuǎn)速,就能驅(qū)動(dòng)車(chē)輪。

第2頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述 程序設(shè)計(jì)者的任務(wù)有兩個(gè):一是設(shè)計(jì)所需要的類(lèi)和對(duì)象,即確定那些數(shù)據(jù)和操作封裝在一起;(類(lèi)設(shè)計(jì)者、核心模塊產(chǎn)品提供商)二是考慮怎樣向有關(guān)對(duì)象發(fā)送消息,以啟動(dòng)相關(guān)對(duì)象的操作。(主程序設(shè)計(jì)者,外包程序,面向用戶的公司) 編程者如同一個(gè)總調(diào)度,不斷地向各個(gè)對(duì)象發(fā)出命令,讓這些對(duì)象活動(dòng)起來(lái),完成指定的工作。 這就是面向?qū)ο蟮某绦蛟O(shè)計(jì)的基本思路。第3頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是對(duì)象(object)? 一個(gè)對(duì)象由一組“屬性”和一組“行為”構(gòu)成。并根據(jù)外界給它的消息進(jìn)行相應(yīng)的操作。系統(tǒng)中多個(gè)對(duì)象通過(guò)一定的渠道相互聯(lián)系。 任何事物都可以看成一個(gè)對(duì)象??梢允亲匀晃矬w,也可以是邏輯結(jié)構(gòu)。例:

一個(gè)班級(jí)作為對(duì)象一個(gè)班級(jí)作為對(duì)象,有兩個(gè)要素:一是班級(jí)的靜態(tài)特征,如班級(jí)所屬的專業(yè),學(xué)生人數(shù)、班主任姓名等,這種靜態(tài)特征稱為“屬性”;另一個(gè)是班級(jí)的動(dòng)態(tài)特征,如上課,體育比賽,開(kāi)會(huì)等,稱為“行為”。外界向班級(jí)發(fā)一個(gè)信息(如上課鈴聲,廣播通知),我們稱之為“消息”,班級(jí)就會(huì)發(fā)生一個(gè)操作(要么上課,要么開(kāi)會(huì))第4頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是C++對(duì)象?

C++中,每個(gè)對(duì)象都由若干數(shù)據(jù)(屬性)和若干函數(shù)(操作行為)組成。數(shù)據(jù)就是對(duì)象的“屬性”,函數(shù)就是用來(lái)對(duì)數(shù)據(jù)進(jìn)行的“操作”,以便實(shí)現(xiàn)某種功能。這種操作就是對(duì)象的“行為”,也叫“方法”。 我們點(diǎn)擊一下鼠標(biāo),按動(dòng)鍵盤(pán)的一個(gè)按鈕,就是給某個(gè)對(duì)象一個(gè)消息,系統(tǒng)回調(diào)用該對(duì)象中的函數(shù)進(jìn)行操作。 比如長(zhǎng)方形對(duì)象,其長(zhǎng)和寬就是它的屬性,調(diào)用該對(duì)象的一些函數(shù),即向該對(duì)象傳送一些消息,可以用來(lái)對(duì)其長(zhǎng)、寬值進(jìn)行加工計(jì)算,以實(shí)現(xiàn)求出面積、周長(zhǎng)等功能。

第5頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是對(duì)象封裝(encapsulation

)? 就是把對(duì)象的不想讓外界知道的屬性和功能屏蔽起來(lái),讓外界看不見(jiàn)。封裝有兩個(gè)含義,一是將有關(guān)的數(shù)據(jù)和操作函數(shù)封裝成一個(gè)基本單位,即對(duì)象內(nèi)。各對(duì)象之間相互獨(dú)立,互不干擾;二是將對(duì)象中的部分屬性或功能對(duì)外隱蔽,只留少數(shù)接口向外公布,以接收外界信息。對(duì)象封裝的好處在于,降低了人們操作對(duì)象的復(fù)雜程度。使用對(duì)象的人,不必知道對(duì)象內(nèi)部的實(shí)現(xiàn)細(xì)節(jié),只需要了解外部功能就可以自如地操作該對(duì)象。 對(duì)象的行為由類(lèi)的內(nèi)部數(shù)據(jù)結(jié)構(gòu)和相關(guān)的操作確定;外部行為通過(guò)操作接口實(shí)現(xiàn)。人們關(guān)心的就是操作接口(函數(shù)名)所能提供的服務(wù)。

第6頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是抽象(abstraction)? 將具有相同特性的事物歸納、集中成一個(gè)統(tǒng)一類(lèi)型,稱為抽象。比如,把張三,李四,王五歸納為一類(lèi),我們稱之為“人”。

抽象的作用,是表示同類(lèi)事物的本質(zhì)。 C和C++中,數(shù)據(jù)類(lèi)型就是對(duì)一批具體數(shù)據(jù)的抽象,整形數(shù)據(jù)就是所有整數(shù)的抽象。

“類(lèi)”是“對(duì)象”的抽象,“對(duì)象”則是類(lèi)的“特例”,或“具體表現(xiàn)形式”。第7頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是繼承(inherit)?

B類(lèi)在A類(lèi)的基礎(chǔ)上增加了少量?jī)?nèi)容。我們顯然不必重新設(shè)計(jì)一個(gè)新類(lèi)B,只需要把A類(lèi)拿過(guò)來(lái),在此基礎(chǔ)上添加新內(nèi)容就可以了。這就是面向?qū)ο蟪绦蛟O(shè)計(jì)的繼承機(jī)制。

C++提供繼承機(jī)制,大大節(jié)省了編程工作量,這就是所謂“軟件重用(softwarereusability)”的思想。對(duì)于大型軟件的開(kāi)發(fā)具有重要意義。第8頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是多態(tài)性(polymorphism)? 如果有幾個(gè)相似而不同的對(duì)象,人們往往要求在向它們發(fā)出同一個(gè)消息時(shí),各自作出不同的操作,這種情況就是“多態(tài)現(xiàn)象”。 C++中,所謂多態(tài)性是指,由繼承而產(chǎn)生的相關(guān)的不同的類(lèi),其對(duì)象對(duì)同一消息會(huì)作出不同的響應(yīng)。 顯然,多態(tài)性能增加程序的靈活性,它是面向?qū)ο蟪绦蛟O(shè)計(jì)的重要特征。第9頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述類(lèi)與對(duì)象的作用

C++全面支持傳統(tǒng)的面向過(guò)程的程序設(shè)計(jì)(即結(jié)構(gòu)化編程),也支持基于對(duì)象和面向?qū)ο蟮某绦蛟O(shè)計(jì)。 所謂基于對(duì)象,是指程序是以類(lèi)和對(duì)象為基礎(chǔ),程序的操作是圍繞對(duì)象進(jìn)行的。 所謂面向?qū)ο?,是指,在基于?duì)象的基礎(chǔ)上,利用了繼承機(jī)制和多態(tài)性。面向?qū)ο蟮某绦蛟O(shè)計(jì)特點(diǎn): 類(lèi)具有對(duì)數(shù)據(jù)的抽象性、封裝性、繼承性、多態(tài)性。第10頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.2類(lèi)的聲明和對(duì)象的定義類(lèi)和對(duì)象的關(guān)系

C++中,對(duì)象的類(lèi)型稱為類(lèi)(class)。類(lèi)代表了某一批對(duì)象的共同特性。前面已經(jīng)談到,類(lèi)是對(duì)象的抽象,而對(duì)象是類(lèi)的具體實(shí)例(instance)。就象結(jié)構(gòu)體類(lèi)型和結(jié)構(gòu)體變量一樣。

C++中,我們先聲明一個(gè)類(lèi)的類(lèi)型,然后再定義該類(lèi)的若干對(duì)象。對(duì)象就是類(lèi)這種類(lèi)型的一個(gè)變量。

類(lèi)是抽象的,不占內(nèi)存,而對(duì)象是具體的,要占用內(nèi)存空間。第11頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.2類(lèi)的聲明和對(duì)象的定義類(lèi)的聲明 類(lèi)的聲明方法和結(jié)構(gòu)體的聲明方法一樣,只是將關(guān)鍵字struct換成class:class類(lèi)名{private:

私有數(shù)據(jù)成員和私有成員函數(shù);

public:

公共數(shù)據(jù)成員和公共成員函數(shù);};//成員訪問(wèn)限定區(qū)域先后次序任意,但一種最好只出現(xiàn)一次,類(lèi)的成員包含對(duì)數(shù)據(jù)操作的函數(shù),體現(xiàn)了數(shù)據(jù)和操作的封裝類(lèi)的成員不能所有都私有,一般隱藏?cái)?shù)據(jù),把成員函數(shù)作為對(duì)外接口成員訪問(wèn)限定符(memberaccessspecifier)成員訪問(wèn)限定符(memberaccessspecifier)別忘了必須用分號(hào)結(jié)束!第12頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.2類(lèi)的聲明和對(duì)象的定義類(lèi)的聲明示例類(lèi)頭:classrectangle類(lèi)體:{private: intlength,width,area,perimeter;public:

voidPutArea() {area=length*width;} voidPutPerimeter() {perimeter=(length+width)*2;}

voiddisplay() {cout<<“l(fā)ength=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;}};在類(lèi)的外面不能訪問(wèn)私有成員,只能通過(guò)公有成員函數(shù)間接訪問(wèn)在類(lèi)的外面可以訪問(wèn)公有成員不指定公有私有,則默認(rèn)為私有一般先出現(xiàn)private,后出現(xiàn)public第13頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六類(lèi)的聲明還有一種protected類(lèi)型,不能被類(lèi)外訪問(wèn),但可以被派生類(lèi)訪問(wèn)一般使用廠商提供的類(lèi)庫(kù)也可以自定義類(lèi)庫(kù),便于單位部門(mén)使用第14頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.2類(lèi)的聲明和對(duì)象的定義對(duì)象的定義 聲明了類(lèi)以后,就可以定義該類(lèi)的對(duì)象了。給對(duì)象分配了存儲(chǔ)空間。其格式為:

[class]類(lèi)名對(duì)象名1,對(duì)象名2,…//方括號(hào)表示可選項(xiàng)對(duì)象定義示例 如前例中,聲明了一個(gè)名為rectangle的類(lèi),我們可以定義該類(lèi)的若干對(duì)象:

classrectangler1,r2,r3; rectangler1,r2,r3;第15頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.2類(lèi)的聲明和對(duì)象的定義對(duì)象定義classrectangle{private: intlength,width,area,perimeter;public: voidPutArea() {area=length*width;} voidPutPerimeter() {perimeter=(length+width)*2;}

voiddisplay() {cout<<“l(fā)ength=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;}}r1,r2;不出現(xiàn)類(lèi)名,直接定義對(duì)象,不提倡第16頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.2類(lèi)的聲明和對(duì)象的定義類(lèi)和結(jié)構(gòu)體類(lèi)型異同struct/classrectangle{ public/private:intlength,width,area,perimeter; voidPutArea() {area=length*width;} voidPutPerimeter() {perimeter=(length+width)*2;}

voiddisplay() {cout<<“l(fā)ength=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;}}r1,r2;建議使用CLASS第17頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.3類(lèi)的成員函數(shù)成員函數(shù)的性質(zhì)類(lèi)的成員函數(shù)也叫類(lèi)函數(shù),用法和一般函數(shù)基本上一樣。區(qū)別在于它只是屬于一個(gè)類(lèi)的成員而出現(xiàn)在類(lèi)中。它可以被指定為類(lèi)的私有成員(private)、公有成員(public)或保護(hù)成員(protected)。 使用類(lèi)函數(shù)時(shí),要注意它的使用權(quán)限,如果是私有成員,只能被本類(lèi)的其他成員函數(shù)調(diào)用,不能被類(lèi)外調(diào)用(工具函數(shù))。成員函數(shù)可以調(diào)用本類(lèi)所有數(shù)據(jù)成員和成員函數(shù),也可以引用在本作用域中的有效數(shù)據(jù)。 通常,我們把類(lèi)的數(shù)據(jù)成員定義成私有成員,對(duì)外屏蔽,而把成員函數(shù)定義成公有成員,他可以調(diào)用私有成員和其它成員。 一個(gè)類(lèi)若沒(méi)有成員函數(shù),就退化成C語(yǔ)言的結(jié)構(gòu)體,而失去意義。

第18頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.3類(lèi)的成員函數(shù)在類(lèi)外定義成員函數(shù) 成員函數(shù)一般在類(lèi)體中定義,如前面所講。也可以在類(lèi)外定義,但要指明是屬于哪個(gè)類(lèi)的成員函數(shù),用“類(lèi)名::函數(shù)名”來(lái)指定。例如:classrectangle{private:intlength,width,;intarea,perimeter;public:voidPutArea();voidPutPerimeter();voiddisplay();};voidrectangle::PutArea(){area=length*width;}voidrectangle::PutPerimeter(){perimeter=(length+width)*2;}voidrectangle::display(){cout<<“l(fā)ength=“<<length<<endl;cout<<“width=“<<width<<endl;cout<<“area=“<<area<<endl;cout<<“perimeter=“<<perimeter;}rectangler1,r2,r3;第19頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六“::”成為域限定符。如果在域限定符前沒(méi)有類(lèi)名,或函數(shù)名前既沒(méi)有類(lèi)名,又沒(méi)有域限定符:

::display()或display()

則表示該函數(shù)不屬于任何類(lèi),它不是成員函數(shù),而是全局函數(shù),即普通函數(shù)。第20頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六一般來(lái)說(shuō),類(lèi)定義包括兩個(gè)部分:1、聲明部分(“做什么”):數(shù)據(jù)成員(名稱、類(lèi)型)

成員函數(shù)(方法)2、實(shí)現(xiàn)部分(“怎么做”):成員函數(shù)的定義和實(shí)現(xiàn)聲明在定義之前,也即是類(lèi)體外定義成員函數(shù)(這里用定義,實(shí)際是給函數(shù)分配了空間,后章節(jié)詳述)減小了類(lèi)體長(zhǎng)度,隱藏了執(zhí)行細(xì)節(jié),提高了類(lèi)的保密性第21頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.3類(lèi)的成員函數(shù)

inline成員函數(shù) 類(lèi)的成員函數(shù)也可以指定為內(nèi)聯(lián)函數(shù),只要是函數(shù)代碼較少,有頻繁使用。我們只要在成員函數(shù)的類(lèi)型簽名加上inline關(guān)鍵字就可以。classrectangle{private:intlength,width,;intarea,perimeter;public:inlinevoidPutArea();

inlinevoidPutPerimeter();

voiddisplay() {cout<<“l(fā)ength=“<<length<<endl; cout<<“width=“<<width<<endl; cout<<“area=“<<area<<endl; cout<<“perimeter=“<<perimeter<<endl;};第22頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.3類(lèi)的成員函數(shù)

inline成員函數(shù)

classrectangle{private:intlength,width,;intarea,perimeter;public:inlinevoidPutArea();

inlinevoidPutPerimeter();voiddisplay();};voidrectangle::display(){cout<<“l(fā)ength=“<<length<<endl;cout<<“width=“<<width<<endl;cout<<“area=“<<area<<endl;cout<<“perimeter=“<<perimeter;}Inline第23頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.3類(lèi)的成員函數(shù)

inline成員函數(shù)類(lèi)體中不包含循環(huán)控制結(jié)構(gòu),此類(lèi)成員函數(shù)自動(dòng)作為inline成員函數(shù)。類(lèi)體外也可定義inline成員函數(shù),聲明、定義其一顯式定義即可,類(lèi)定義和其成員函數(shù)定義必須在同一文件(或包含)。

第24頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.3類(lèi)的成員函數(shù)成員函數(shù)的存儲(chǔ)方式

同一類(lèi)定義了多個(gè)對(duì)象時(shí),每個(gè)對(duì)象的數(shù)據(jù)成員各自占據(jù)獨(dú)立的空間,而共享一個(gè)共用的函數(shù)代碼段,不占用對(duì)象的存儲(chǔ)空間。

C++為此專門(mén)設(shè)立了一個(gè)名為this的指針,用來(lái)指向不同的對(duì)象。當(dāng)調(diào)用對(duì)象r1,成員函數(shù)訪問(wèn)的就是r1的數(shù)據(jù)成員。所以成員函數(shù)建議在類(lèi)體外定義。數(shù)據(jù)1對(duì)象r1數(shù)據(jù)2對(duì)象r2數(shù)據(jù)10對(duì)象r10…共用函數(shù)代碼第25頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.4對(duì)象成員的引用用對(duì)象名和成員運(yùn)算符(.)訪問(wèn)對(duì)象成員舉例:

classrectangle{public:

intlength,width;//公共數(shù)據(jù)成員voiddisplay();//公共成員函數(shù)};voidrectangle::display(){cout<<“area=“<<length*width<<ednl;cout<<“perimeter=“<<(length+width)*2;}voidmain(){rectangler1;

r1.lenght=5;//用對(duì)象名和成員運(yùn)算符)訪問(wèn)數(shù)據(jù)成員

r1.width=4;//用對(duì)象名和成員運(yùn)算符(.)訪問(wèn)數(shù)據(jù)成員

r1.display();//用對(duì)象名和成員運(yùn)算符(.)訪問(wèn)成員函數(shù)}用這種方式訪問(wèn)的成員,必須定義成公用成員!第26頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.4對(duì)象成員的引用用指向?qū)ο蟮闹羔樤L問(wèn)對(duì)象成員舉例:(*p).length被簡(jiǎn)化成p->length

classrectangle{public:

intlength,width;//公共數(shù)據(jù)成員voiddisplay();//公共成員函數(shù)};voidrectangle::display(){cout<<“area=“<<length*width<<ednl;cout<<“perimeter=“<<(length+width)*2;}voidmain(){rectangler2,*p;p=&r2;

p->lenght=5;

p->width=4;

p->display();}用這種方式萬(wàn)分的成員,也必須定義成公用成員!第27頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.4對(duì)象成員的引用用對(duì)象的引用訪問(wèn)對(duì)象成員舉例:

classrectangle{public:

intlength,width;//公共數(shù)據(jù)成員voiddisplay();//公共成員函數(shù)};voidrectangle::display(){cout<<“area=“<<length*width<<ednl;cout<<“perimeter=“<<(length+width)*2;}voidmain(){rectangler2;rectangle&r3=r2;

r3.lenght=5;

r3.width=4;

r3.display();}第28頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例定義一個(gè)時(shí)間類(lèi),并定義一個(gè)對(duì)象及其引用,輸入時(shí)分秒輸出時(shí):分:秒#include<iostream>usingnamespacestd;intmain(){Timet1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}

第29頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;

Time&t2=t1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}

第30頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例定義2個(gè)對(duì)象,分別輸入時(shí)分秒輸出時(shí):分:秒#include<iostream>classTime{public:inthour;intminute;intsec;};intmain(){return0;}第31頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t1.sec<<endl;Timet2;cin>>t2.hour;cin>>t2.minute;cin>>t2.sec;cout<<t2.hour<<":"<<t2.minute<<":"<<t2.sec<<endl;return0;}第32頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例:定義函數(shù)執(zhí)行輸入輸出#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};

intmain(){

voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);return0;}

第33頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){voidset_time(Time&);voidshow_time(Time&);Timet1;set_time(t1);show_time(t1);Timet2;set_time(t2);show_time(t2);return0;}

voidset_time(Time&t){cin>>t.hour;cin>>t.minute;cin>>t.sec;}

voidshow_time(Time&t){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}第34頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例:定義含默認(rèn)值參數(shù)的set_time和show_time函數(shù)#include<iostream>classTime{public:inthour;intminute;intsec;};intmain(){Timet1;set_time(t1,12,23,34);show_time(t1);Timet2;set_time(t2);show_time(t2);}

第35頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){

voidset_time(Time&,inthour=0,intminute=0,intsec=0);

voidshow_time(Time&);Timet1;set_time(t1,12,23,34);show_time(t1);Timet2;set_time(t2);show_time(t2);

return0;}

voidset_time(Time&t,inthour=9,intminute=30,intsec=0){t.hour=hour;t.minute=minute;t.sec=sec;}

voidshow_time(Time&t){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}第36頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例:定義成員函數(shù)輸入時(shí)分秒并輸出#include<iostream>classTime{public:private:inthour;intminute;intsec;};intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();}

voidTime::set_time(){cin>>hour;cin>>minute;cin>>sec;}

voidTime::show_time(){cout<<hour<<":"<<minute<<":"<<sec<<endl;}第37頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例#include<iostream>usingnamespacestd;classTime{public:

voidset_time();voidshow_time();private:inthour;intminute;intsec;};intmain(){Timet1;t1.set_time();t1.show_time();Timet2;t2.set_time();t2.show_time();return0;}

voidTime::set_time(){cin>>hour;cin>>minute;cin>>sec;}

voidTime::show_time(){cout<<hour<<":"<<minute<<":"<<sec<<endl;}第38頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六習(xí)題1第39頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六習(xí)題1#include<iostream>usingnamespacestd;classTime{public:

inthour;intminute;intsec;};Timet;voidset_time(void){cin>>t.hour;cin>>t.minute;cin>>t.sec;}voidshow_time(void){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}intmain(){set_time();show_time();return0;}第40頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六例2.4P61#include<iostream>usingnamespacestd;classArray_max{public:voidset_value();voidmax_value();voidshow_value();private:intarray[10];intmax;};intmain(){Array_maxarrmax;arrmax.set_value();arrmax.max_value();arrmax.show_value();return0;}第41頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.6類(lèi)的封裝和信息隱蔽公用接口和私有實(shí)現(xiàn)的分離 我們已經(jīng)學(xué)到,C++通過(guò)類(lèi)的封裝,將類(lèi)的數(shù)據(jù)成員和成員函數(shù)集成到一個(gè)類(lèi)中。而一般在類(lèi)的聲明時(shí),往往把數(shù)據(jù)成員指定成私有的,使它們與外界隔離,即,不能在類(lèi)外直接使用私有成員,外界只能通過(guò)類(lèi)的公有函數(shù),間接進(jìn)行對(duì)私有成員的操作。換句話說(shuō),外界與類(lèi)的私有成員的唯一聯(lián)系渠道,就是該類(lèi)的公有成員函數(shù)。 所以,我們一般把成員函數(shù)指定成公有的(public)性質(zhì)(除非某些成員函數(shù)不想讓外界調(diào)用)。 這就是所謂的“外部接口”與內(nèi)部實(shí)現(xiàn)的分離,以起到信息隱蔽的作用。而這是軟件工程最基本的原則。第42頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六定義一個(gè)類(lèi)就是實(shí)現(xiàn)對(duì)創(chuàng)建一個(gè)對(duì)象的數(shù)據(jù)結(jié)構(gòu)的描述。在類(lèi)中,一些成員是保護(hù)的,被有效地屏蔽,以防外界的干擾和誤操作。另一些成員是公共的,作為接口提供外界使用。右圖是對(duì)它們采用的圖示方法說(shuō)明類(lèi)的組成結(jié)構(gòu)。以Point類(lèi)為例。xoffsetyoffsetsetangleradiusxy封裝體內(nèi)部數(shù)據(jù)成員Point類(lèi)訪問(wèn)接口第43頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.6類(lèi)的封裝和信息隱蔽類(lèi)聲明和成員函數(shù)定義的分離 當(dāng)一個(gè)類(lèi)被多個(gè)程序使用時(shí),一般將類(lèi)的聲明(包括成員函數(shù)的聲明)放在指定的頭文件中,用戶在編程時(shí),將該頭文件包含近來(lái)就可以了。而不必在每個(gè)使用該類(lèi)的程序中重復(fù)書(shū)寫(xiě)該類(lèi)的聲明。 我們?nèi)缓罂梢灾苯釉诔绦蛑兄苯佣x該類(lèi)的對(duì)象,直接調(diào)用該類(lèi)的公有成員函數(shù)。為了實(shí)現(xiàn)信息隱蔽,對(duì)類(lèi)的成員函數(shù)的定義一般不放在頭文件中,而放在另一個(gè)文件中。

然后按照對(duì)多文件程序的編譯和運(yùn)行方法對(duì)程序進(jìn)行編譯和連接。請(qǐng)看下面示例。 第44頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.6類(lèi)的封裝和信息隱蔽//rectangle.hclassrectangle{private: intlength,width;public: voidPut(); voiddisplay();};//rectangle.cpp#include<iostream.h>#include“rectangle.h”voidrectangle::Put(){length=5;width=4;}voidrectangle::display(){cout<<“area=“<<length*width<<endl;}//main.cpp#include<iostream.h>#include“rectangle.h”voidmain(){rectangler1;r1.display();}第45頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.6類(lèi)的封裝和信息隱蔽 在實(shí)際運(yùn)用中,將若干功能相近的類(lèi)聲明集中在一起,形成類(lèi)庫(kù)。類(lèi)庫(kù)包括兩個(gè)組成部分:類(lèi)聲明頭文件;經(jīng)過(guò)編譯的頭文件函數(shù)的定義的目標(biāo)文件。 用戶只需要將類(lèi)庫(kù)裝入自己的計(jì)算機(jī)中C++系統(tǒng)的子目錄下,并在程序中用#include命令將有關(guān)類(lèi)聲明的頭文件包含到程序中,就可以使用這些類(lèi)和其中的成員函數(shù)了。第46頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六2.6類(lèi)的封裝和信息隱蔽面向?qū)ο蟪绦蛟O(shè)計(jì)中的幾個(gè)名詞方法:method,指對(duì)數(shù)據(jù)的操作。消息:其實(shí)就是一個(gè)命令,由程序語(yǔ)句實(shí)現(xiàn)。外界通過(guò)發(fā)送“消息”來(lái)激活有關(guān)的方法。 比如: rectangle.dispaly();

就是向rectangle對(duì)象發(fā)一個(gè)消息,通知它執(zhí)行其中的“display()”方法。 這一條語(yǔ)句就涉及到對(duì)象、消息、方法這三個(gè)術(shù)語(yǔ)。

rectangel:是對(duì)象;

display():是方法;

rectangel.display():是消息。第47頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六習(xí)題2#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};Timet;intmain(){t.set_time();t.show_time();}第48頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六習(xí)題2#include<iostream>usingnamespacestd;classTime{public:voidset_time(void){cin>>hour;cin>>minute;cin>>sec;}

voidshow_time(void){cout<<hour<<":"<<minute<<":"<<sec<<endl;}

private:inthour;intminute;intsec;};Timet;intmain(){t.set_time();t.show_time();return0;}第49頁(yè),共56頁(yè),2022年,5月20日,15點(diǎn)21分,星期六習(xí)題3#include<iostream>classTime{public:private:inthou

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論