面向?qū)ο蟪绦蛟O(shè)計之類和對象實用全套PPT_第1頁
面向?qū)ο蟪绦蛟O(shè)計之類和對象實用全套PPT_第2頁
面向?qū)ο蟪绦蛟O(shè)計之類和對象實用全套PPT_第3頁
面向?qū)ο蟪绦蛟O(shè)計之類和對象實用全套PPT_第4頁
面向?qū)ο蟪绦蛟O(shè)計之類和對象實用全套PPT_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

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

第二頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計方法(fāngfǎ)概述 程序設(shè)計者的任務(wù)有兩個:一是設(shè)計所需要的類和對象,即確定那些數(shù)據(jù)和操作封裝在一起;(類設(shè)計者、核心模塊產(chǎn)品提供商)二是考慮怎樣向有關(guān)對象發(fā)送消息,以啟動相關(guān)對象的操作。(主程序設(shè)計者,外包程序,面向用戶的公司) 編程者如同一個總調(diào)度,不斷地向各個對象發(fā)出命令,讓這些(zhèxiē)對象活動起來,完成指定的工作。 這就是面向?qū)ο蟮某绦蛟O(shè)計的基本思路。第三頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計(chénɡxùshèjì)方法概述什么是對象(duìxiàng)(object)? 一個對象(duìxiàng)由一組“屬性”和一組“行為”構(gòu)成。并根據(jù)外界給它的消息進行相應(yīng)的操作。系統(tǒng)中多個對象(duìxiàng)通過一定的渠道相互聯(lián)系。 任何事物都可以看成一個對象(duìxiàng)??梢允亲匀晃矬w,也可以是邏輯結(jié)構(gòu)。例:一個班級作為對象(duìxiàng)一個班級作為對象(duìxiàng),有兩個要素:一是班級的靜態(tài)特征,如班級所屬的專業(yè),學(xué)生人數(shù)、班主任姓名等,這種靜態(tài)特征稱為“屬性”;另一個是班級的動態(tài)特征,如上課,體育比賽,開會等,稱為“行為”。外界向班級發(fā)一個信息(如上課鈴聲,廣播通知),我們稱之為“消息”,班級就會發(fā)生一個操作(要么上課,要么開會)第四頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計(chénɡxùshèjì)方法概述什么是C++對象? C++中,每個對象都由若干數(shù)據(jù)(屬性)和若干函數(shù)(hánshù)(操作行為)組成。數(shù)據(jù)就是對象的“屬性”,函數(shù)(hánshù)就是用來對數(shù)據(jù)進行的“操作”,以便實現(xiàn)某種功能。這種操作就是對象的“行為”,也叫“方法”。 我們點擊一下鼠標,按動鍵盤的一個按鈕,就是給某個對象一個消息,系統(tǒng)回調(diào)用該對象中的函數(shù)(hánshù)進行操作。 比如長方形對象,其長和寬就是它的屬性,調(diào)用該對象的一些函數(shù)(hánshù),即向該對象傳送一些消息,可以用來對其長、寬值進行加工計算,以實現(xiàn)求出面積、周長等功能。

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

第六頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計(chénɡxùshèjì)方法概述什么是抽象(abstraction)? 將具有相同特性的事物歸納、集中成一個統(tǒng)一類型,稱為抽象。比如,把張三,李四,王五歸納為一類,我們稱之為“人”。 抽象的作用,是表示同類事物的本質(zhì)(běnzhì)。 C和C++中,數(shù)據(jù)類型就是對一批具體數(shù)據(jù)的抽象,整形數(shù)據(jù)就是所有整數(shù)的抽象。 “類”是“對象”的抽象,“對象”則是類的“特例”,或“具體表現(xiàn)形式”。第七頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計方法(fāngfǎ)概述什么是繼承(inherit)? B類在A類的基礎(chǔ)上增加了少量(shǎoliàng)內(nèi)容。我們顯然不必重新設(shè)計一個新類B,只需要把A類拿過來,在此基礎(chǔ)上添加新內(nèi)容就可以了。這就是面向?qū)ο蟪绦蛟O(shè)計的繼承機制。 C++提供繼承機制,大大節(jié)省了編程工作量,這就是所謂“軟件重用(softwarereusability)”的思想。對于大型軟件的開發(fā)具有重要意義。第八頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計(chénɡxùshèjì)方法概述什么是多態(tài)性(polymorphism)? 如果有幾個相似而不同的對象,人們往往要求在向它們發(fā)出同一個消息時,各自作出不同的操作,這種情況就是“多態(tài)現(xiàn)象”。 C++中,所謂多態(tài)性是指,由繼承而產(chǎn)生的相關(guān)的不同的類,其對象對同一消息會作出不同的響應(yīng)。 顯然,多態(tài)性能增加(zēngjiā)程序的靈活性,它是面向?qū)ο蟪绦蛟O(shè)計的重要特征。第九頁,共54頁。2.1面向?qū)ο蟪绦蛟O(shè)計方法(fāngfǎ)概述類與對象的作用 C++全面支持傳統(tǒng)的面向過程的程序設(shè)計(即結(jié)構(gòu)化編程),也支持基于對象和面向?qū)ο蟮某绦蛟O(shè)計。 所謂基于對象,是指程序是以類和對象為基礎(chǔ),程序的操作是圍繞對象進行(jìnxíng)的。 所謂面向?qū)ο?,是指,在基于對象的基礎(chǔ)上,利用了繼承機制和多態(tài)性。面向?qū)ο蟮某绦蛟O(shè)計特點: 類具有對數(shù)據(jù)的抽象性、封裝性、繼承性、多態(tài)性。第十頁,共54頁。2.2類的聲明(shēngmíng)和對象的定義類和對象的關(guān)系 C++中,對象的類型稱為類(class)。類代表了某一批對象的共同特性。前面已經(jīng)談到,類是對象的抽象,而對象是類的具體實例(instance)。就象結(jié)構(gòu)體類型和結(jié)構(gòu)體變量一樣。 C++中,我們先聲明一個類的類型,然后再定義該類的若干(ruògān)對象。對象就是類這種類型的一個變量。

類是抽象的,不占內(nèi)存,而對象是具體的,要占用內(nèi)存空間。第十一頁,共54頁。2.2類的聲明和對象(duìxiàng)的定義類的聲明 類的聲明方法和結(jié)構(gòu)體的聲明方法一樣,只是(zhǐshì)將關(guān)鍵字struct換成class:class類名{private: 私有數(shù)據(jù)成員和私有成員函數(shù);public: 公共數(shù)據(jù)成員和公共成員函數(shù);};//成員訪問限定區(qū)域先后次序任意,但一種最好只出現(xiàn)一次,類的成員包含對數(shù)據(jù)操作的函數(shù),體現(xiàn)了數(shù)據(jù)和操作的封裝類的成員不能所有都私有,一般隱藏數(shù)據(jù),把成員函數(shù)作為對外接口成員(chéngyuán)訪問限定符(memberaccessspecifier)成員訪問限定符(memberaccessspecifier)別忘了必須用分號結(jié)束!第十二頁,共54頁。2.2類的聲明和對象(duìxiàng)的定義類的聲明(shēngmíng)示例類頭: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;}};在類的外面不能訪問私有成員,只能通過(tōngguò)公有成員函數(shù)間接訪問在類的外面可以訪問公有成員不指定公有私有,則默認為私有一般先出現(xiàn)private,后出現(xiàn)public第十三頁,共54頁。類的聲明(shēngmíng)還有一種protected類型,不能被類外訪問,但可以被派生類訪問一般使用廠商(chǎngshāng)提供的類庫也可以自定義類庫,便于單位部門使用第十四頁,共54頁。2.2類的聲明和對象(duìxiàng)的定義對象的定義 聲明了類以后,就可以定義該類的對象了。給對象分配了存儲空間。其格式為: [class]類名對象名1,對象名2,…//方括號表示可選項對象定義示例 如前例中,聲明了一個名為rectangle的類,我們(wǒmen)可以定義該類的若干對象: classrectangler1,r2,r3; rectangler1,r2,r3;第十五頁,共54頁。2.2類的聲明和對象(duìxiàng)的定義對象定義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)(chūxiàn)類名,直接定義對象,不提倡第十六頁,共54頁。2.2類的聲明(shēngmíng)和對象的定義類和結(jié)構(gòu)(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;建議(jiànyì)使用CLASS第十七頁,共54頁。2.3類的成員(chéngyuán)函數(shù)成員函數(shù)的性質(zhì)類的成員函數(shù)也叫類函數(shù),用法和一般函數(shù)基本上一樣。區(qū)別在于它只是屬于一個類的成員而出現(xiàn)在類中。它可以被指定為類的私有成員(private)、公有成員(public)或保護成員(protected)。 使用類函數(shù)時,要注意它的使用權(quán)限,如果是私有成員,只能被本類的其他(qítā)成員函數(shù)調(diào)用,不能被類外調(diào)用(工具函數(shù))。成員函數(shù)可以調(diào)用本類所有數(shù)據(jù)成員和成員函數(shù),也可以引用在本作用域中的有效數(shù)據(jù)。 通常,我們把類的數(shù)據(jù)成員定義成私有成員,對外屏蔽,而把成員函數(shù)定義成公有成員,他可以調(diào)用私有成員和其它成員。 一個類若沒有成員函數(shù),就退化成C語言的結(jié)構(gòu)體,而失去意義。 第十八頁,共54頁。2.3類的成員(chéngyuán)函數(shù)在類外定義成員函數(shù) 成員函數(shù)一般在類體中定義,如前面所講。也可以在類外定義,但要指明是屬于(shǔyú)哪個類的成員函數(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;第十九頁,共54頁?!?:”成為域限定符。如果在域限定符前沒有類名,或函數(shù)名前既沒有類名,又沒有域限定符: ::display()或display() 則表示該函數(shù)不屬于任何類,它不是成員函數(shù),而是全局(quánjú)函數(shù),即普通函數(shù)。第二十頁,共54頁。一般來說,類定義包括兩個部分:1、聲明部分(“做什么(shénme)”):數(shù)據(jù)成員(名稱、類型)成員函數(shù)(方法)2、實現(xiàn)部分(“怎么做”):成員函數(shù)的定義和實現(xiàn)聲明在定義之前,也即是類體外定義成員函數(shù)(這里用定義,實際是給函數(shù)分配了空間,后章節(jié)詳述)減小了類體長度,隱藏了執(zhí)行細節(jié),提高了類的保密性第二十一頁,共54頁。2.3類的成員(chéngyuán)函數(shù) inline成員(chéngyuán)函數(shù) 類的成員(chéngyuán)函數(shù)也可以指定為內(nèi)聯(lián)函數(shù),只要是函數(shù)代碼較少,有頻繁使用。我們只要在成員(chéngyuán)函數(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;};第二十二頁,共54頁。2.3類的成員(chéngyuán)函數(shù) inline成員(chéngyuán)函數(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第二十三頁,共54頁。2.3類的成員(chéngyuán)函數(shù) inline成員函數(shù)類體中不包含循環(huán)控制結(jié)構(gòu),此類成員函數(shù)自動作為inline成員函數(shù)。類體外也可定義inline成員函數(shù),聲明、定義其一顯式定義即可,類定義和其成員函數(shù)定義必須在同一(tóngyī)文件(或包含)。

第二十四頁,共54頁。2.3類的成員(chéngyuán)函數(shù)成員函數(shù)的存儲(cúnchǔ)方式 同一類定義了多個對象時,每個對象的數(shù)據(jù)成員各自占據(jù)獨立的空間,而共享一個共用的函數(shù)代碼段,不占用對象的存儲(cúnchǔ)空間。 C++為此專門設(shè)立了一個名為this的指針,用來指向不同的對象。當調(diào)用對象r1,成員函數(shù)訪問的就是r1的數(shù)據(jù)成員。所以成員函數(shù)建議在類體外定義。數(shù)據(jù)1對象r1數(shù)據(jù)2對象r2數(shù)據(jù)10對象r10…共用函數(shù)代碼第二十五頁,共54頁。2.4對象(duìxiàng)成員的引用用對象(duìxiàng)名和成員運算符(.)訪問對象(duìxiàng)成員舉例:

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;//用對象名和成員運算符)訪問(fǎngwèn)數(shù)據(jù)成員r1.width=4;//用對象名和成員運算符(.)訪問(fǎngwèn)數(shù)據(jù)成員r1.display();//用對象名和成員運算符(.)訪問(fǎngwèn)成員函數(shù)}用這種方式訪問的成員,必須定義成公用成員!第二十六頁,共54頁。2.4對象成員(chéngyuán)的引用用指向?qū)ο蟮闹羔樤L問對象成員(chéngyuán)舉例:(*p).length被簡化成p->length

classrectangle{public:intlength,width;//公共(gōnggòng)數(shù)據(jù)成員voiddisplay();//公共(gōnggòng)成員函數(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();}用這種方式萬分的成員,也必須定義成公用成員!第二十七頁,共54頁。2.4對象(duìxiàng)成員的引用用對象的引用訪問對象成員(chéngyuán)舉例: classrectangle{public:intlength,width;//公共數(shù)據(jù)成員(chéngyuán)voiddisplay();//公共成員(chéngyuán)函數(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();}第二十八頁,共54頁。例定義一個時間類,并定義一個對象(duìxiàng)及其引用,輸入時分秒輸出時:分:秒#include<iostream>usingnamespacestd;intmain(){Timet1;cin>>t2.hour;cin>>t2.minute;cin>>t1.sec;cout<<t1.hour<<":"<<t1.minute<<":"<<t2.sec<<endl;}

第二十九頁,共54頁。例#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;}

第三十頁,共54頁。例定義2個對象(duìxiàng),分別輸入時分秒輸出時:分:秒#include<iostream>classTime{public:inthour;intminute;intsec;};intmain(){return0;}第三十一頁,共54頁。例#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;}第三十二頁,共54頁。例:定義函數(shù)(hánshù)執(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;}

第三十三頁,共54頁。例#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;}第三十四頁,共54頁。例:定義(dìngyì)含默認值參數(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);}

第三十五頁,共54頁。例#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;}第三十六頁,共54頁。例:定義成員(chéngyuán)函數(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;}第三十七頁,共54頁。例#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;}第三十八頁,共54頁。習題(xítí)1第三十九頁,共54頁。習題(xítí)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;}第四十頁,共54頁。例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;}第四十一頁,共54頁。2.6類的封裝和信息隱蔽公用接口和私有實現(xiàn)的分離 我們已經(jīng)學(xué)到,C++通過類的封裝,將類的數(shù)據(jù)成員和成員函數(shù)集成到一個類中。而一般在類的聲明時,往往把數(shù)據(jù)成員指定成私有的,使它們與外界隔離,即,不能在類外直接使用私有成員,外界只能通過類的公有函數(shù),間接進行對私有成員的操作。換句話說,外界與類的私有成員的唯一聯(lián)系渠道,就是該類的公有成員函數(shù)。 所以,我們一般把成員函數(shù)指定成公有的(public)性質(zhì)(除非某些成員函數(shù)不想讓外界調(diào)用)。 這就是所謂的“外部接口”與內(nèi)部實現(xiàn)的分離,以起到信息隱蔽的作用。而這是軟件工程最基本(jīběn)的原則。第四十二頁,共54頁。定義一個類就是實現(xiàn)對創(chuàng)建一個對象的數(shù)據(jù)結(jié)構(gòu)的描述。在類中,一些成員是保護的,被有效地屏蔽,以防外界的干擾和誤操作。另一些成員是公共(gōnggòng)的,作為接口提供外界使用。右圖是對它們采用的圖示方法說明類的組成結(jié)構(gòu)。以Point類為例。xoffsetyoffsetsetangleradiusxy封裝體內(nèi)部數(shù)據(jù)成員Point類訪問接口第四十三頁,共54頁。2.6類的封裝和信息隱蔽類聲明和成員函數(shù)定義的分離 當一個類被多個程序使用時,一般將類的聲明(包括成員函數(shù)的聲明)放在指定的頭文件中,用戶在編程時,將該頭文件包含近來就可以了。而不必在每個使用該類的程序中重復(fù)書寫(shūxiě)該類的聲明。 我們?nèi)缓罂梢灾苯釉诔绦蛑兄苯佣x該類的對象,直接調(diào)用該類的公有成員函數(shù)。為了實現(xiàn)信息隱蔽,對類的成員函數(shù)的定義一般不放在頭文件中,而放在另一個文件中。 然后按照對多文件程序的編譯和運行方法對程序進行編譯和連接。請看下面示例。 第四十四頁,共54頁。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();}第四十五頁,共54頁。2.6類的封裝和信息隱蔽 在實際運用中,將若干功能(gōngnéng)相近的類聲明集中在一起,形成類庫。類庫包括兩個組成部分:類聲明頭文件;經(jīng)過編譯的頭文件函數(shù)的定義的目標文件。 用戶只需要將類庫裝入自己的計算機中C++系統(tǒng)的子目錄下,并在程序中用#include命令將有關(guān)類聲明的頭文件包含到程序中,就可以使用這些類和其中的成員函數(shù)了。第四十六頁,共54頁。2.6類的封裝和信息隱蔽面向?qū)ο蟪绦蛟O(shè)計中的幾個名詞方法:method,指對數(shù)據(jù)的操作。消息:其實就是一個命令,由程序語句實現(xiàn)。外界通過發(fā)送“消息”來激活有關(guān)的方法。 比如: rectangle.dispaly(); 就是向rectangle對象發(fā)一個消息,通知它執(zhí)行(zhíxíng)其中的“display()”方法。 這一條語句就涉及到對象、消息、方法這三個術(shù)語。 rectangel:是對象; display():是方法; rectangel.display():是消息。第四十七頁,共54頁。習題(xítí)2#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};Timet;intmain(){t.set_time();t.show_time();}第四十八頁,共54頁。習題(xítí)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.sho

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論