




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章類和對象
面向過程的程序設(shè)計:以功能為中心,采用函數(shù)來描述。
面向?qū)ο蟪绦蛟O(shè)計(OOP):面向?qū)ο蟪绦蛟O(shè)計方法認(rèn)為,客觀世界是由各種各樣的實(shí)體組成的,這些實(shí)體就是面向?qū)ο蠓椒ㄖ械膶ο?。消息是向某對象請求服?wù)的一種表達(dá)方式對象之間的交互通過發(fā)送消息來實(shí)現(xiàn)。消息包括:目標(biāo)對象,請求的方法,參數(shù)8.1面向?qū)ο蟪绦蛟O(shè)計方法概述8.1.1什么是面向?qū)ο蟮某绦蛟O(shè)計1.對象客觀世界中任何一個事物都可以看成一個對象。對象兩要素:屬性(attribute):對象的靜態(tài)特征行為(behavior):對象的動態(tài)特征,它能根據(jù)外界給的信息進(jìn)行相應(yīng)的操作。一個對象是由一組屬性和一組行為構(gòu)成的。圖8.1
在一個系統(tǒng)中的多個對象之間通過一定的渠道相互聯(lián)系,要使某一個對象實(shí)現(xiàn)某一種行為(即操作),應(yīng)當(dāng)向它傳送相應(yīng)的消息。對象之間就是這樣通過發(fā)送和接收消息互相聯(lián)系的。在C++中,每個對象都是由數(shù)據(jù)和函數(shù)(即操作代碼)這兩部分組成的,見圖:如三角形對象:屬性:它的3個邊長。行為:計算出三角形的面積,并且輸出調(diào)用對象中的函數(shù)就是向該對象傳送一個消息(message),要求該對象實(shí)現(xiàn)某一行為(功能)。2.封裝與信息隱蔽“封裝”,指兩方面的含義:將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個對象中,形成一個基本單位,各個對象之間相對獨(dú)立,互不干擾。將對象中某些部分對外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。
C++的對象中的函數(shù)名就是對象的對外接口,外界可以通過函數(shù)名來調(diào)用這些函數(shù)來實(shí)現(xiàn)某些行為(功能)。3.抽象抽象(abstraction):有關(guān)事物的共性歸納、集中的過程。抽象的作用是表示同一類事物的本質(zhì)。 對象是具體存在的,如一個三角形可以作為一個對象,10個不同尺寸的三角形是10個對象。如果這10個三角形對象有相同的屬性和行為,可以將它們抽象為一種類型,稱為三角形類型。在C++中,這種類型就稱為“類(class)”。這10個三角形就是屬于同一“類”的對象。類是對象的抽象,而對象則是類的特例,或者說是類的具體表現(xiàn)形式。4.繼承與重用繼承:在原有基礎(chǔ)上增加新的內(nèi)容。例:白色的馬重用:利用一個已有的類建立一個新的類,即“軟件重用”思想。5.多態(tài)性多態(tài)性:是指允許不同類的對象對同一個消息作出的響應(yīng)各不相同。多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計的一個重要特征,能增加程序的靈活性。一個傳統(tǒng)的面向過程程序設(shè)計是圍繞功能進(jìn)行的,用一個函數(shù)實(shí)現(xiàn)功能。所有的數(shù)據(jù)都是公用的,一個函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被多個函數(shù)所使用(見圖8.3)。
面向?qū)ο蟪绦蛟O(shè)計的特點(diǎn)圖8.3面向?qū)ο蟪绦蛟O(shè)計任務(wù)包括兩個方面:一是設(shè)計所需的各種類和對象,即決定把哪些數(shù)據(jù)和操作封裝在一起;二是考慮怎樣向有關(guān)對象發(fā)送消息,以完成所需的任務(wù)。 這時他如同一個總調(diào)度,不斷地向各個對象發(fā)出命令,讓這些對象活動起來(或者說激活這些對象),完成自己職責(zé)范圍內(nèi)的工作。各個對象的操作完成了,整體任務(wù)也就完成了。在面向過程的結(jié)構(gòu)化程序設(shè)計中程序表述: 程序=算法+數(shù)據(jù)結(jié)構(gòu)在面向?qū)ο蟮慕Y(jié)構(gòu)化程序設(shè)計中程序表述: 對象=算法+數(shù)據(jù)結(jié)構(gòu) 程序=(對象+對象+對象+…)+消息或: 程序=對象s+消息“對象s”表示多個對象。消息的作用就是對對象的控制。程序設(shè)計的關(guān)鍵是設(shè)計好每一個對象,及確定向這些對象發(fā)出的命令,使各對象完成相應(yīng)操作。8.1.3類和對象的作用面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€部分:面向?qū)ο蠓治?objectorientedanalysis,OOA)面向?qū)ο笤O(shè)計(objectorienteddesign,OOD)面向?qū)ο缶幊?objectorientedprogramming,
OOP)面向?qū)ο鬁y試(objectorientedtest,OOT)面向?qū)ο缶S護(hù)(objectorientedsoft
maintenance,OOSM)8.1.4面向?qū)ο蟮能浖_發(fā)每一個實(shí)體都是對象。對象的類型稱為類(class)。類是對象的抽象,而對象是類的具體實(shí)例(instance)例如:結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的關(guān)系一樣,在C++中也是先聲明一個類類型,然后用它去定義若干個同類型的對象。對象就是類類型的一個變量??梢哉f類是對象的模板。類是抽象的,不占用內(nèi)存,而對象是具體的,占用存儲空間。8.2類的聲明和對象的定義
8.2.1類和對象的關(guān)系下面是聲明一個結(jié)構(gòu)體類型的方法:structStudent
//聲明了一個名為Student的結(jié)構(gòu)體類型{ intnum; charname[20]; charsex;};Studentstud1,stud2;
//定義了兩個結(jié)構(gòu)體變量stud1和stud2。它只包括數(shù)據(jù),沒有包括操作。8.2.2聲明類類型類是用戶自己指定的類型。必須自己根據(jù)需要進(jìn)行聲明,類要先聲明后使用?,F(xiàn)在聲明一個類:
classStudent//以class開頭{ intnum; charname[20]; charsex; //以上3行是數(shù)據(jù)成員
voiddisplay()//這是成員函數(shù)
{ cout<<″num:″<<num<<endl; cout<<″name:″<<name<<endl; cout<<″sex:″<<sex<<endl; }};Studentstud1,stud2;定義了Student類的對象stud1和stud2類聲明的一般形式如下:
class類名
{private:
私有的數(shù)據(jù)和成員函數(shù); public:
公用的數(shù)據(jù)和成員函數(shù); };private和public稱為成員訪問限定符。如果在類的定義中既不指定private
或public
,則系統(tǒng)就默認(rèn)為是私有的。
protected聲明的成員稱為受保護(hù)的成員,它不能被類外訪問(這點(diǎn)與私有成員類似),但可以被派生類的成員函數(shù)訪問。1.先聲明類類型,然后再定義對象(1)class
類名對象名例如:classStudentstud1,stud2;(2)類名對象名例如:Studentstud1,stud2;8.2.3定義對象的方法2.在聲明類類型的同時定義對象classStudent //聲明類類型{public: //先聲明公用部分
voiddisplay(){ cout<<″num:″<<num<<endl; cout<<″name:″<<name<<endl; cout<<″sex:″<<sex<<endl;}private: //后聲明私有部分
intnum; charname[20]; charsex;}stud1,stud2; //定義了兩個Student類的對象3.不出現(xiàn)類名,直接定義對象class
//無類名{private:
//聲明以下部分為私有的┆
public:
//聲明以下部分為公用的┆
}stud1,stud2;
//定義了兩個無類名的類對象
直接定義對象,在C++中是合法的、允許的,但卻很少用,也不提倡用。在定義一個對象時,編譯系統(tǒng)會為這個對象分配存儲空間,以存放對象中的成員。用struct定義一個類型class聲明的類關(guān)鍵字不同:struct數(shù)據(jù)都是公用的關(guān)鍵字不同:class默認(rèn)為private8.2.4類和結(jié)構(gòu)體類型的異同structStudent{ intnum; charname[20]; charsex;voiddisplay(){ cout<<num<<endl; cout<<name<<endl; cout<<sex<<endl;}};classStudent{ intnum; charname[20]; charsex;voiddisplay(){cout<<num<<endl; cout<<name<<endl; cout<<sex<<endl;}};公有的私有的
類的成員函數(shù)與一般函數(shù)的區(qū)別:類的成員函數(shù)屬于一個類的成員,出現(xiàn)在類體中。它可以被指定為private(私有的)、public(公用的)或protected(受保護(hù)的)。在使用類函數(shù)時,要注意調(diào)用它的權(quán)限(它能否被調(diào)用)以及它的作用域(函數(shù)能使用什么范圍中的數(shù)據(jù)和函數(shù))。例如:私有的成員函數(shù)只能被本類中的其他成員函數(shù)所調(diào)用,而不能被類外調(diào)用。8.3類的成員函數(shù)
8.3.1成員函數(shù)的性質(zhì)classStudent{public:voiddisplay(); //在類內(nèi)聲明display類函數(shù)private:intnum;stringname;charsex;};voidStudent∷display() //在類外定義類函數(shù){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}Studentstud1,stud2; //定義兩個類對象8.3.2在類外定義成員函數(shù)注意:在類體中直接定義函數(shù)時,函數(shù)名前不加類名成員函數(shù)在類外定義時,必須在函數(shù)名前面加上類名,予以限定(qualifed),“∷”是作用域限定符如果函數(shù)名前面既無類名又無作用域運(yùn)算符“∷”,如:∷display()或display()則表示display函數(shù)是全局函數(shù),即一般普通函數(shù)。類函數(shù)在類外定義,類體的位置應(yīng)在函數(shù)定義之前如果一個函數(shù),其函數(shù)體只有2~3行,一般可在聲明類時在類體中定義。為了提高運(yùn)行時的效率,對于較簡單的函數(shù)可以聲明為內(nèi)聯(lián)形式(函數(shù)代碼嵌入程序的調(diào)用點(diǎn))內(nèi)聯(lián)函數(shù)體中不能有復(fù)雜結(jié)構(gòu)(如循環(huán)語句和switch語句)在類中聲明內(nèi)聯(lián)成員函數(shù)的方式:將函數(shù)體放在類的聲明中。使用inline關(guān)鍵字。8.3.3inline成員函數(shù)例:在類中定義內(nèi)聯(lián)函數(shù)。classStudent{public:voiddisplay() //或inlinevoiddisplay()
{ cout<<″num:″<<num<<endl; cout<<″name:″<<name<<endl; cout<<″sex:″<<sex<<endl;}private: intnum; stringname; charsex;};例:在類中聲明、類外定義的內(nèi)聯(lián)成員函數(shù)classStudent{public: inlinevoiddisplay(); //聲明此函數(shù)為內(nèi)置函數(shù)private: intnum;stringname;charsex;};inlinevoidStudent∷display() //在類外定義內(nèi)聯(lián)函數(shù){ cout<<″num:″<<num<<endl; cout<<″name:″<<name<<endl; cout<<″sex:″<<sex<<endl;}例如:計算該類對象所占用的字節(jié)數(shù)。classTime{public: inthour;intminute;intsec;voidset(){ cin>>a>>b>>c;}};可以用下面的語句來輸出該類對象所占用的字節(jié)數(shù):cout<<sizeof(Time)<<endl; //輸出值為12成員函數(shù)的存儲:
在程序中經(jīng)常需要訪問對象中的成員。訪問對象中的成員可以有3種方法:通過對象名和成員運(yùn)算符訪問對象中的成員;
通過指向?qū)ο蟮闹羔樤L問對象中的成員;
通過對象的引用變量訪問對象中的成員。8.4對象成員的引用一般形式為: 對象名.成員名例如:stud1.num=1001;stud1.display();√display();×注意:只能訪問public成員,而不能訪問private成員,如果已定義num為私有數(shù)據(jù)成員,下面的語句是錯誤的:stud1.num=10101;×//num不能被外界引用8.4.1通過對象名和成員運(yùn)算符訪問對象中的成員如果有以下程序段:
classTime{public: //數(shù)據(jù)成員是公用的inthour;intminute;};Timet,*p;//定義對象t和指針變量pp=&t; //使p指向?qū)ο髏cout<<p->hour;//輸出p指向的對象中的成員hour在p指向t的前提下,p->hour,(*p).hour和t.hour三者等價。8.4.2通過指向?qū)ο蟮闹羔樤L問對象中的成員
如果為一個對象定義了一個引用變量,它們是共占同一段存儲單元的,實(shí)際上它們是同一個對象,可以通過引用變量來訪問對象中的成員。如果已聲明了Time類,并有以下定義語句:Timet1;//定義對象t1Time&t2=t1;//定義Time類引用變量t2,并使之初始化為t1cout<<t2.hour;//輸出對象t1中的成員hour由于t2與t1共占同一段存儲單元(即t2是t1的別名),因此t2.hour就是t1.hour。8.4.3通過對象的引用變量來訪問對象中的成員t1t2公用成員函數(shù)是用戶使用類的公用接口(publicinterface),或者說是類的對外接口。通過成員函數(shù)對數(shù)據(jù)成員進(jìn)行操作稱為類的實(shí)現(xiàn)類中被操作的數(shù)據(jù)是私有的,實(shí)現(xiàn)的細(xì)節(jié)對用戶是隱蔽的,這種實(shí)現(xiàn)稱為私有實(shí)現(xiàn)(privateimplementation)。這種“類的公用接口與私有實(shí)現(xiàn)的分離”形成了信息隱蔽。8.5類的封裝性和信息隱蔽
8.5.1公用接口與私有實(shí)現(xiàn)的分離如果將類的聲明放在指定的頭文件中,用戶如果想用該類,只要把有關(guān)的頭文件包含進(jìn)來即可。8.5.2類聲明和成員函數(shù)定義的分離例如,可以分別寫兩個文件://student.h(這是頭文件,在此文件中進(jìn)行類的聲明)classStudent//類聲明{public:voiddisplay();//公用成員函數(shù)原型聲明private:intnum;charname[20];charsex;};//student.cpp//在此文件中進(jìn)行函數(shù)的定義#include<iostream>#include″student.h″//不要漏寫此行,否則編譯通不過voidStudent∷display()//在類外定義display類函數(shù){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}//main.cpp主函數(shù)模塊#include<iostream>#include″student.h″//將類聲明頭文件包含進(jìn)來intmain(){Studentstud; //定義對象stud.display();//執(zhí)行stud對象的display函數(shù)return0;}注意:由于將頭文件student.h放在用戶當(dāng)前目錄中,因此在文件名兩側(cè)用雙撇號包起來(″student.h″),否則編譯時會找不到此文件。圖8.6成員函數(shù)的定義不放在頭文件。若干個常用的功能相近的類聲明集中在一起,形成類庫。類庫有兩種:標(biāo)準(zhǔn)類庫和用戶類庫。類庫包括兩個組成部分:
(1)類聲明頭文件;
(2)已經(jīng)過編譯的成員函數(shù)的定義,它是目標(biāo)文件。用戶只需把類庫裝入到自己的計算機(jī)系統(tǒng)中(一般裝到C++編譯系統(tǒng)所在的子目錄下),并在程序中用#include命令行將有關(guān)的類聲明的頭文件包含到程序中,就可以使用這些類和其中的成員函數(shù),順利地運(yùn)行程序。在用戶程序中包含類聲明頭文件,類聲明頭文件就成為用戶使用類的公用接口例8.1最簡單的例子。#include<iostream>usingnamespacestd;classTime//定義Time類{public://數(shù)據(jù)成員為公用的
inthour;intminute;intsec;};8.6類和對象的簡單應(yīng)用舉例intmain(){Timet1;//定義t1為Time類對象cin>>t1.hour;//輸入設(shè)定的時間cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;//輸出時間return0;}運(yùn)行情況如下:123243↙12:32:43注意:(1)在引用數(shù)據(jù)成員hour,minute,sec時不要忘記在前面指定對象名。(2)不要錯寫為類名,如寫成Time.hour,Time.minute,Time.sec是不對的。因?yàn)轭愂且环N抽象的數(shù)據(jù)類型,并不是一個實(shí)體,也不占存儲空間,而對象是實(shí)際存在的實(shí)體,是占存儲空間的,其數(shù)據(jù)成員是有值的,可以被引用的。(3)如果刪去主函數(shù)的3個輸入語句,即不向這些數(shù)據(jù)成員賦值,則它們的值是不可預(yù)知的。例8.2引用多個對象的成員。(1)程序(a)#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Timet1;//定義對象t1cin>>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;}運(yùn)行情況如下:103243↙10:32:43223243↙22:32:43(2)程序(b)#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;}運(yùn)行情況與程序(a)相同。(3)程序(c)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);//普通函數(shù)調(diào)用,無初始值使用默認(rèn)參數(shù)show_time(t2);return0;}voidset_time(Time&t,inthour,intminute,intsec){ t.hour=hour; t.minute=minute; t.sec=sec;}voidshow_time(Time&t){ cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;}程序運(yùn)行時的輸出為:12:23:34(t1中的時、分、秒)0:0:0(t2中的時、分、秒)
以上兩個程序中定義的類都只有數(shù)據(jù)成員,沒有成員函數(shù),這顯然沒有體現(xiàn)出使用類的優(yōu)越性。在下面的例子中,類體中就包含了成員函數(shù)。例8.3將例8.2的程序改用含成員函數(shù)的類來處理。#include<iostream>usingnamespacestd;classTime{public: voidset_time(); //公用成員函數(shù)
voidshow_time(); //公用成員函數(shù)
private: //數(shù)據(jù)成員為私有
inthour; intminute; intsec;};intmain(){Timet1;
//定義對象t1t1.set_time();
//調(diào)用對象t1的成員函數(shù)set_time,輸入數(shù)據(jù)t1.show_time();
//調(diào)用對象t1的成員函數(shù)show_time,輸出數(shù)據(jù)Timet2;
//定義對象t2t2.set_time();
//調(diào)用對象t2的成員函數(shù)set_time,輸入數(shù)據(jù)t2.show_time();
//調(diào)用對象t2的成員函數(shù)show_time,輸出數(shù)據(jù)return0;}voidTime∷set_time()//在類外定義set_time函數(shù){
cin>>hour;cin>>minute;cin>>sec;}voidTime∷show_time()//在類外定義show_time函數(shù){
cout<<hour<<″:″<<minute<<″:″<<sec<<endl;}運(yùn)行情況與例8.2中的程序(a)相同。注意:在主函數(shù)中調(diào)用兩個成員函數(shù)時,應(yīng)指明對象名(t1,t2)。在類外定義函數(shù)時,應(yīng)指明函數(shù)的作用域(
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年撫順師范高等??茖W(xué)校單招職業(yè)技能測試題庫帶答案
- 第六單元《智取生辰綱》施耐庵教學(xué)設(shè)計-2023-2024學(xué)年統(tǒng)編版語文九年級上冊標(biāo)簽標(biāo)題
- 二年級數(shù)學(xué)北師大版上冊第八單元《8.3買球》教學(xué)設(shè)計教案2
- 全國清華大學(xué)版信息技術(shù)九年級上冊第3單元第9課《系統(tǒng)集成-菜單編輯》教學(xué)設(shè)計
- 第14課《背影》教學(xué)設(shè)計 2024-2025學(xué)年統(tǒng)編版語文八年級上冊
- 2024六安市大數(shù)據(jù)公司公開招聘工作人員1人筆試參考題庫附帶答案詳解
- 2025至2030年中國氣動隔絕門數(shù)據(jù)監(jiān)測研究報告
- -粵教版(2019)高中信息技術(shù)必修一 6.1認(rèn)識人工智能 教學(xué)設(shè)計
- 山東省部分示范校2024-2025學(xué)年高三上學(xué)期摸底檢測(零診)地理試題(解析版)
- 2025年貴州機(jī)電職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫及答案一套
- XX學(xué)院社團(tuán)指導(dǎo)老師學(xué)期考核表
- 低鉀血癥最新版本最新課件
- 獸醫(yī)外科手術(shù)學(xué)與獸醫(yī)外科學(xué)章節(jié)測試及答案
- 2023年陜西延長石油礦業(yè)有限責(zé)任公司招聘筆試題庫及答案解析
- YY/T 1792-2021熒光免疫層析分析儀
- GB/T 39235-2020豬營養(yǎng)需要量
- GB/T 30799-2014食品用洗滌劑試驗(yàn)方法重金屬的測定
- 染廠公司簡介(4個范本)
- PPT用中國地圖(可編輯)
- 基于德育的農(nóng)村中小學(xué)校園欺凌現(xiàn)象的解決對策優(yōu)秀獲獎科研論文
- 鐵路工程概預(yù)算-工程經(jīng)濟(jì)管理培訓(xùn)-課件
評論
0/150
提交評論