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

下載本文檔

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

文檔簡介

關(guān)于面向?qū)ο蟪绦蛟O(shè)計(jì)之類和對象第一頁,共五十六頁,2022年,8月28日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問題的思路是相似的。比如,我們生產(chǎn)汽車時(shí),不是順序制造發(fā)動機(jī),在設(shè)計(jì)制造底盤、車身、輪子。而是分別設(shè)計(jì)制造發(fā)動機(jī)、底盤、車身和輪子,最后組裝在一起。組裝時(shí),各部件之間有聯(lián)系,以便協(xié)調(diào)工作。例如,司機(jī)踩油門,就能調(diào)節(jié)油路,控制發(fā)動機(jī)的轉(zhuǎn)速,就能驅(qū)動車輪。

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

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

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

第五頁,共五十六頁,2022年,8月28日2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是對象封裝(encapsulation

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

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

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

“類”是“對象”的抽象,“對象”則是類的“特例”,或“具體表現(xiàn)形式”。第七頁,共五十六頁,2022年,8月28日2.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述什么是繼承(inherit)?

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

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

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

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

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

類是抽象的,不占內(nèi)存,而對象是具體的,要占用內(nèi)存空間。第十一頁,共五十六頁,2022年,8月28日2.2類的聲明和對象的定義類的聲明 類的聲明方法和結(jié)構(gòu)體的聲明方法一樣,只是將關(guān)鍵字struct換成class:class類名{private:

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

public:

公共數(shù)據(jù)成員和公共成員函數(shù);};//成員訪問限定區(qū)域先后次序任意,但一種最好只出現(xiàn)一次,類的成員包含對數(shù)據(jù)操作的函數(shù),體現(xiàn)了數(shù)據(jù)和操作的封裝類的成員不能所有都私有,一般隱藏?cái)?shù)據(jù),把成員函數(shù)作為對外接口成員訪問限定符(memberaccessspecifier)成員訪問限定符(memberaccessspecifier)別忘了必須用分號結(jié)束!第十二頁,共五十六頁,2022年,8月28日2.2類的聲明和對象的定義類的聲明示例類頭: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;}};在類的外面不能訪問私有成員,只能通過公有成員函數(shù)間接訪問在類的外面可以訪問公有成員不指定公有私有,則默認(rèn)為私有一般先出現(xiàn)private,后出現(xiàn)public第十三頁,共五十六頁,2022年,8月28日類的聲明還有一種protected類型,不能被類外訪問,但可以被派生類訪問一般使用廠商提供的類庫也可以自定義類庫,便于單位部門使用第十四頁,共五十六頁,2022年,8月28日2.2類的聲明和對象的定義對象的定義 聲明了類以后,就可以定義該類的對象了。給對象分配了存儲空間。其格式為:

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

classrectangler1,r2,r3; rectangler1,r2,r3;第十五頁,共五十六頁,2022年,8月28日2.2類的聲明和對象的定義對象定義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)類名,直接定義對象,不提倡第十六頁,共五十六頁,2022年,8月28日2.2類的聲明和對象的定義類和結(jié)構(gòu)體類型異同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第十七頁,共五十六頁,2022年,8月28日2.3類的成員函數(shù)成員函數(shù)的性質(zhì)類的成員函數(shù)也叫類函數(shù),用法和一般函數(shù)基本上一樣。區(qū)別在于它只是屬于一個(gè)類的成員而出現(xiàn)在類中。它可以被指定為類的私有成員(private)、公有成員(public)或保護(hù)成員(protected)。 使用類函數(shù)時(shí),要注意它的使用權(quán)限,如果是私有成員,只能被本類的其他成員函數(shù)調(diào)用,不能被類外調(diào)用(工具函數(shù))。成員函數(shù)可以調(diào)用本類所有數(shù)據(jù)成員和成員函數(shù),也可以引用在本作用域中的有效數(shù)據(jù)。 通常,我們把類的數(shù)據(jù)成員定義成私有成員,對外屏蔽,而把成員函數(shù)定義成公有成員,他可以調(diào)用私有成員和其它成員。 一個(gè)類若沒有成員函數(shù),就退化成C語言的結(jié)構(gòu)體,而失去意義。

第十八頁,共五十六頁,2022年,8月28日2.3類的成員函數(shù)在類外定義成員函數(shù) 成員函數(shù)一般在類體中定義,如前面所講。也可以在類外定義,但要指明是屬于哪個(gè)類的成員函數(shù),用“類名::函數(shù)名”來指定。例如: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;第十九頁,共五十六頁,2022年,8月28日“::”成為域限定符。如果在域限定符前沒有類名,或函數(shù)名前既沒有類名,又沒有域限定符:

::display()或display()

則表示該函數(shù)不屬于任何類,它不是成員函數(shù),而是全局函數(shù),即普通函數(shù)。第二十頁,共五十六頁,2022年,8月28日一般來說,類定義包括兩個(gè)部分:1、聲明部分(“做什么”):數(shù)據(jù)成員(名稱、類型)

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

inline成員函數(shù) 類的成員函數(shù)也可以指定為內(nèi)聯(lián)函數(shù),只要是函數(shù)代碼較少,有頻繁使用。我們只要在成員函數(shù)的類型簽名加上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;};第二十二頁,共五十六頁,2022年,8月28日2.3類的成員函數(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第二十三頁,共五十六頁,2022年,8月28日2.3類的成員函數(shù)

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

第二十四頁,共五十六頁,2022年,8月28日2.3類的成員函數(shù)成員函數(shù)的存儲方式

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

C++為此專門設(shè)立了一個(gè)名為this的指針,用來指向不同的對象。當(dāng)調(diào)用對象r1,成員函數(shù)訪問的就是r1的數(shù)據(jù)成員。所以成員函數(shù)建議在類體外定義。數(shù)據(jù)1對象r1數(shù)據(jù)2對象r2數(shù)據(jù)10對象r10…共用函數(shù)代碼第二十五頁,共五十六頁,2022年,8月28日2.4對象成員的引用用對象名和成員運(yùn)算符(.)訪問對象成員舉例:

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;//用對象名和成員運(yùn)算符)訪問數(shù)據(jù)成員

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

r1.display();//用對象名和成員運(yùn)算符(.)訪問成員函數(shù)}用這種方式訪問的成員,必須定義成公用成員!第二十六頁,共五十六頁,2022年,8月28日2.4對象成員的引用用指向?qū)ο蟮闹羔樤L問對象成員舉例:(*p).length被簡化成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();}用這種方式萬分的成員,也必須定義成公用成員!第二十七頁,共五十六頁,2022年,8月28日2.4對象成員的引用用對象的引用訪問對象成員舉例:

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();}第二十八頁,共五十六頁,2022年,8月28日例定義一個(gè)時(shí)間類,并定義一個(gè)對象及其引用,輸入時(shí)分秒輸出時(shí):分:秒#include<iostream>usingnamespacestd;intmain(){Timet1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}

第二十九頁,共五十六頁,2022年,8月28日例#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;}

第三十頁,共五十六頁,2022年,8月28日例定義2個(gè)對象,分別輸入時(shí)分秒輸出時(shí):分:秒#include<iostream>classTime{public:inthour;intminute;intsec;};intmain(){return0;}第三十一頁,共五十六頁,2022年,8月28日例#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;}第三十二頁,共五十六頁,2022年,8月28日例:定義函數(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;}

第三十三頁,共五十六頁,2022年,8月28日例#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;}第三十四頁,共五十六頁,2022年,8月28日例:定義含默認(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);}

第三十五頁,共五十六頁,2022年,8月28日例#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;}第三十六頁,共五十六頁,2022年,8月28日例:定義成員函數(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;}第三十七頁,共五十六頁,2022年,8月28日例#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;}第三十八頁,共五十六頁,2022年,8月28日習(xí)題1第三十九頁,共五十六頁,2022年,8月28日習(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;}第四十頁,共五十六頁,2022年,8月28日例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;}第四十一頁,共五十六頁,2022年,8月28日2.6類的封裝和信息隱蔽公用接口和私有實(shí)現(xiàn)的分離 我們已經(jīng)學(xué)到,C++通過類的封裝,將類的數(shù)據(jù)成員和成員函數(shù)集成到一個(gè)類中。而一般在類的聲明時(shí),往往把數(shù)據(jù)成員指定成私有的,使它們與外界隔離,即,不能在類外直接使用私有成員,外界只能通過類的公有函數(shù),間接進(jìn)行對私有成員的操作。換句話說,外界與類的私有成員的唯一聯(lián)系渠道,就是該類的公有成員函數(shù)。 所以,我們一般把成員函數(shù)指定成公有的(public)性質(zhì)(除非某些成員函數(shù)不想讓外界調(diào)用)。 這就是所謂的“外部接口”與內(nèi)部實(shí)現(xiàn)的分離,以起到信息隱蔽的作用。而這是軟件工程最基本的原則。第四十二頁,共五十六頁,2022年,8月28日定義一個(gè)類就是實(shí)現(xiàn)對創(chuàng)建一個(gè)對象的數(shù)據(jù)結(jié)構(gòu)的描述。在類中,一些成員是保護(hù)的,被有效地屏蔽,以防外界的干擾和誤操作。另一些成員是公共的,作為接口提供外界使用。右圖是對它們采用的圖示方法說明類的組成結(jié)構(gòu)。以Point類為例。xoffsetyoffsetsetangleradiusxy封裝體內(nèi)部數(shù)據(jù)成員Point類訪問接口第四十三頁,共五十六頁,2022年,8月28日2.6類的封裝和信息隱蔽類聲明和成員函數(shù)定義的分離 當(dāng)一個(gè)類被多個(gè)程序使用時(shí),一般將類的聲明(包括成員函數(shù)的聲明)放在指定的頭文件中,用戶在編程時(shí),將該頭文件包含近來就可以了。而不必在每個(gè)使用該類的程序中重復(fù)書寫該類的聲明。 我們?nèi)缓罂梢灾苯釉诔绦蛑兄苯佣x該類的對象,直接調(diào)用該類的公有成員函數(shù)。為了實(shí)現(xiàn)信息隱蔽,對類的成員函數(shù)的定義一般不放在頭文件中,而放在另一個(gè)文件中。

然后按照對多文件程序的編譯和運(yùn)行方法對程序進(jìn)行編譯和連接。請看下面示例。 第四十四頁,共五十六頁,2022年,8月28日2.6類的封裝和信息隱蔽//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();}第四十五頁,共五十六頁,2022年,8月28日2.6類的封裝和信息隱蔽 在實(shí)際運(yùn)用中,將若干功能相近的類聲明集中在一起,形成類庫。類庫包括兩個(gè)組成部分:類聲明頭文件;經(jīng)過編譯的頭文件函數(shù)的定義的目標(biāo)文件。 用戶只需要將類庫裝入自己的計(jì)算機(jī)中C++系統(tǒng)的子目錄下,并在程序中用#include命令將有關(guān)類聲明的頭文件包含到程序中,就可以使用這些類和其中的成員函數(shù)了。第四十六頁,共五十六頁,2022年,8月28日2.6類的封裝和信息隱蔽面向?qū)ο蟪绦蛟O(shè)計(jì)中的幾個(gè)名詞方法:method,指對數(shù)據(jù)的操作。消息:其實(shí)就是一個(gè)命令,由程序語句實(shí)現(xiàn)。外界通過發(fā)送“消息”來激活有關(guān)的方法。 比如: rectangle.dispaly();

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

rectangel:是對象;

display():是方法;

rectangel.display():是消息。第四十七頁,共五十六頁,2022年,8月28日習(xí)題2#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};Timet;intmain(){t.set_time();t.show_time();}第四十八頁,共五十六頁,2022年,8月28日習(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;}第四十九頁,共五十六頁,2022年,8月28日習(xí)題3#include<iostream>classTime{public:private:

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論