版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第8章類和對(duì)象C++程序設(shè)計(jì)第8章類和對(duì)象C++程序設(shè)計(jì)1本章內(nèi)容8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述8.2類的聲明和對(duì)象的定義8.3類的成員函數(shù)8.4對(duì)象成員的引用8.5類和對(duì)象的簡單應(yīng)用舉例8.6類的封裝性和信息隱蔽Logo本章內(nèi)容8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo28.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述
面向?qū)ο蟪绦蛟O(shè)計(jì):把同一對(duì)象的數(shù)據(jù)和操作封裝在一起,使用對(duì)象、類、繼承、封裝、消息等基本概念來進(jìn)行的程序設(shè)計(jì)。例如:人們生產(chǎn)汽車時(shí),發(fā)動(dòng)機(jī)、底盤、車身和輪子分別由不同生產(chǎn)廠商設(shè)計(jì)和制造,最后由汽車制造商組裝在一起。在組裝時(shí),各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作,各部分內(nèi)部如何工作一無所知。為了進(jìn)一步說明問題,下面先討論幾個(gè)有關(guān)的概念。OO=對(duì)象+類+消息+繼承+封裝+多態(tài)Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述面向?qū)ο蟪绦蛟O(shè)計(jì)38.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象
對(duì)象是具有明顯邊界和含義的概念、抽象或事物,一個(gè)對(duì)象代表了一個(gè)現(xiàn)實(shí)的或虛擬的實(shí)體。自然實(shí)體概念實(shí)體軟件實(shí)體化學(xué)過程連接顯示Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象自然實(shí)體化學(xué)過程48.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象對(duì)象(Object)是包含客觀世界物體特征的抽象實(shí)體,客觀世界中任何一個(gè)事物都可以看成一個(gè)對(duì)象。對(duì)象可大可小。對(duì)象是構(gòu)成系統(tǒng)的基本單位。對(duì)象由屬性(Attribute)和行為(Action)兩部分組成。對(duì)象的兩個(gè)要素:屬性和行為。屬性:對(duì)象的特征,定義成員變量描述。行為:對(duì)象的動(dòng)作,定義成員函數(shù)完成。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象Logo58.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象屬性舉例:一個(gè)學(xué)生對(duì)象屬性:姓名、號(hào)碼、性別、職業(yè)、年級(jí)。一個(gè)教師對(duì)象屬性:姓名、號(hào)碼、性別、職業(yè)、職務(wù)。一臺(tái)錄像機(jī)對(duì)象屬性:型號(hào)、品牌、體積、重量、價(jià)格。一臺(tái)筆記本電腦對(duì)象的屬性:?Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象屬性舉例:Logo68.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象行為舉例:一個(gè)學(xué)生對(duì)象行為:聽課、交作業(yè)、考試。一個(gè)教師對(duì)象行為:講課、改作業(yè)、監(jiān)考。一臺(tái)錄像機(jī)對(duì)象行為:錄像、播放、暫停、快進(jìn)、停止。一臺(tái)筆記本電腦的行為:?Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象行為舉例:Logo78.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述在一個(gè)系統(tǒng)中的多個(gè)對(duì)象之間通過一定的渠道相互聯(lián)系,如圖8.1示意。要使某一個(gè)對(duì)象實(shí)現(xiàn)某一種行為(即操作),應(yīng)當(dāng)向它傳送相應(yīng)的消息。對(duì)象之間就是這樣通過發(fā)送和接收消息互相聯(lián)系的。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述在一個(gè)系統(tǒng)中88.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類每一個(gè)實(shí)體都是對(duì)象。有一些對(duì)象是具有相同的結(jié)構(gòu)和行為的。每個(gè)對(duì)象都屬于一個(gè)特定的類型。類(Class)是一組具有相同結(jié)構(gòu)和行為的對(duì)象的集合。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類Logo98.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類類的舉例:學(xué)生類、教師類、錄像機(jī)、筆記本電腦、汽車、飲料、氣體、礦石、人、動(dòng)物…….如:10個(gè)不同尺寸的三角形是10個(gè)對(duì)象。這10個(gè)三角形對(duì)象有相同的屬性結(jié)構(gòu)和行為,可以將它們抽象為一種類型,稱為三角形類型。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類如:10個(gè)不同尺寸的108.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽封裝:將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個(gè)對(duì)象中,形成一個(gè)基本單位,各個(gè)對(duì)象之間相對(duì)獨(dú)立,互不干擾。信息隱蔽:將對(duì)象中某些部分對(duì)外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留少量接口,以便與外界聯(lián)系,接收外界的消息。信息隱蔽有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。封裝可以降低復(fù)雜度和出錯(cuò)的可能性,提高類或模塊的可重用性、隱藏性,使用方便,易于維護(hù)。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽封裝可118.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽Log128.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述4.繼承與派生
繼承是一種由已有的類創(chuàng)建新類的機(jī)制。子類從父類繼承了共性,又派生出自己的各自的特性。父類--子類(派生類)
將門虎子——繼承Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述4.繼承與派生Logo13LogoLogo148.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo158.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo168.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述
父類別可以被多個(gè)子類別繼承,子類別也可以是別的類的父類,從而建立類繼承的層次結(jié)構(gòu)。Cow類Lion類Tiger類Animals類Carnivorous類Herbivorous類Coat類Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述父類別可以被178.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述C++提供了繼承機(jī)制,采用繼承的方法可以很方便地利用一個(gè)已有的類建立一個(gè)新的類。這就是常說的“軟件重用”(softwarereusability)的思想。繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不能完全解決)時(shí),需要對(duì)原有程序進(jìn)行改造。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述C++提供了繼188.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述5.多態(tài)性由繼承而產(chǎn)生的相關(guān)的不同的類,其對(duì)象對(duì)同一消息會(huì)作出不同的響應(yīng)。如:動(dòng)物都會(huì)叫,但不同的動(dòng)物的叫聲不同。如:在Windows環(huán)境下,用鼠標(biāo)雙擊一個(gè)文件對(duì)象(這就是向?qū)ο髠魉鸵粋€(gè)消息),根據(jù)文件對(duì)象的不同,將做不同的操作。如果是可執(zhí)行文件,則會(huì)執(zhí)行此程序;如果是文本文件,則啟動(dòng)文本編輯器并打開該文件。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述5.多態(tài)性Logo198.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)面對(duì)的是一個(gè)個(gè)對(duì)象。程序設(shè)計(jì)者的任務(wù)包括兩個(gè)方面:
(1)設(shè)計(jì)所需的各種類和對(duì)象,即決定把哪些數(shù)據(jù)和操作封裝在一起;(2)考慮怎樣向有關(guān)對(duì)象發(fā)送消息,以完成所需的任務(wù)。這時(shí)他如同一個(gè)總調(diào)度,不斷地向各個(gè)對(duì)象發(fā)出命令,讓這些對(duì)象活動(dòng)起來(或者說激活這些對(duì)象),完成自己職責(zé)范圍內(nèi)的工作。各個(gè)對(duì)象的操作完成了,整體任務(wù)也就完成了。顯然,對(duì)一個(gè)大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計(jì)方法是十分有效的,它能大大降低程序設(shè)計(jì)人員的工作難度,減少出錯(cuò)機(jī)會(huì)。Logo8.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)面對(duì)的是一208.1.4面向?qū)ο蟮能浖_發(fā)
隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十分復(fù)雜。需要規(guī)范整個(gè)軟件開發(fā)過程,明確軟件開發(fā)過程中每個(gè)階段的任務(wù),在保證前一個(gè)階段工作的正確性的情況下,再進(jìn)行下一階段的工作。這就是軟件工程學(xué)需要研究和解決的問題。面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€(gè)部分:Logo8.1.4面向?qū)ο蟮能浖_發(fā)隨著軟件規(guī)模的218.1.4面向?qū)ο蟮能浖_發(fā)Logo8.1.4面向?qū)ο蟮能浖_發(fā)Logo228.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系每一個(gè)對(duì)象都是某一個(gè)類的實(shí)例;每一個(gè)類在某一時(shí)刻都有零個(gè)或更多的實(shí)例;類是靜態(tài)的,它們的存在、語義和關(guān)系在程序執(zhí)行前就已經(jīng)定義好了;對(duì)象是動(dòng)態(tài)的,它們?cè)诔绦驁?zhí)行時(shí)可以被創(chuàng)建和刪除;類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。在一開始時(shí)弄清對(duì)象和類的關(guān)系是十分重要的。Logo8.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系Logo238.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系白馬非馬——對(duì)象和類這是中國古代偉大的邏輯學(xué)家公孫龍(約公元前320--250年)提出的一個(gè)著名的邏輯問題,出自《公孫龍子·白馬論》。類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例。Logo8.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系類是對(duì)象248.2類的聲明和對(duì)象的定義
8.2.2類的聲明在C++中聲明一個(gè)類類型和聲明一個(gè)結(jié)構(gòu)體類型是相似的。以前,定義結(jié)構(gòu)體類型,描述一個(gè)對(duì)象:struct
Student
{intnum;charname[20];charsex;};Studentstud1,stud2;//定義了兩個(gè)結(jié)構(gòu)體變量stud1和stud2我們把一個(gè)對(duì)象可能具有的動(dòng)作,加入到對(duì)象的描述中,就形成了類。Logo8.2類的聲明和對(duì)象的定義8.2.2類的聲明我們把一個(gè)對(duì)象258.2.2類的聲明class
Student//以class開頭{intnum;charname[20];charsex;//以上3行是數(shù)據(jù)成員voiddisplay()//這是成員函數(shù){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;
//以上4行是函數(shù)中的操作語句}};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象stud1和stud2可以看到聲明類的方法是由聲明結(jié)構(gòu)體類型的方法發(fā)展而來的。Logo8.2.2類的聲明classStudent268.2.2類的聲明class<類名>{[[private:]//私有成員,缺省存取權(quán)限 <數(shù)據(jù)成員及成員函數(shù)
>][public://公有成員 <數(shù)據(jù)成員及成員函數(shù)
>][protected://保護(hù)成員 <數(shù)據(jù)成員及成員函數(shù)
>]};Logo8.2.2類的聲明class<類名>Logo278.2.2類的聲明類一經(jīng)定義就形成了邊界,達(dá)成了封裝,就像建了一幢房子訪問修飾符的作用就是在房子上開窗,開門,讓別人可以訪問。訪問修飾符Logo8.2.2類的聲明類一經(jīng)定義就形成了邊界,達(dá)成了封裝,就像288.2.2類的聲明訪問修飾符不受任何限制,本類或非本類均可隨意訪問。public本類及其子類可以訪問(父子友好),同一個(gè)包中的其它類也可訪問(包內(nèi)友好)。protected只有相同包中的類可以訪問(包內(nèi)友好)。缺省只有本類可以訪問,其余都不可以。privateLogo8.2.2類的聲明訪問修飾符不受任何限制,本類或非本類均可298.2.2類的聲明publicprotectedprivate本類可以可以可以同包子類可以可以不可以同包非子類可以可以不可以不同包子類可以可以不可以不同包且非子類可以不可以不可以訪問修飾符Logo8.2.2類的聲明publicprotectedpriva308.2.2類的聲明注意:
(1)在聲明類類型時(shí),聲明為private的成員和聲明為public的成員的次序任意,既可以先出現(xiàn)private部分,也可以先出現(xiàn)public部分。(2)如果在類體中既不寫關(guān)鍵字private,又不寫public,就默認(rèn)為private。(3)在一個(gè)類體中,關(guān)鍵字private和public可以分別出現(xiàn)多次。每個(gè)部分的有效范圍到出現(xiàn)另一個(gè)訪問限定符或類體結(jié)束時(shí)(最后一個(gè)右花括號(hào))為止。但是為了使程序清晰,應(yīng)該養(yǎng)成這樣的習(xí)慣:使每一種成員訪問限定符在類定義體中只出現(xiàn)一次。Logo8.2.2類的聲明注意:Logo318.2.2類的聲明可以將上面類Student的聲明改為class
Student//聲明類類型{
private://聲明以下部分為私有的intnum;charname[20];charsex;public://聲明以下部分為公用的voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}
};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象Logo8.2.2類的聲明可以將上面類Student的聲明改為Lo328.2.2類的聲明不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起來,而把成員函數(shù)作為對(duì)外界的接口。Logo8.2.2類的聲明不能把類中的全部成員與外界隔離,一般是把338.2.3對(duì)象的定義private:idnamemajorfeespublic:registerStudent類對(duì)象stu10521140張三Computer16000register對(duì)象stu10522240李四Network16000registerLogo8.2.3對(duì)象的定義private:public:Stu348.2.3對(duì)象的定義1.先聲明類類型,然后再定義對(duì)象聲明了類類型后,定義對(duì)象有兩種形式。(1)class
類名
對(duì)象名
classStudentstud1,stud2;把class和Student合起來作為一個(gè)類名,用來定義對(duì)象。(2)類名
對(duì)象名
Studentstud1,stud2;直接用類名定義對(duì)象。這兩種方法是等效的。Logo8.2.3對(duì)象的定義1.先聲明類類型,然后再定義對(duì)象Lo358.2.3對(duì)象的定義classStudent{private:
intid;
char
name[20];
char
major[20];
floatfees;public:
void
register() {
cin>>id>>name>>major>>fees; }};
Studentstu1,stu2;Logo8.2.3對(duì)象的定義classStudentLogo368.2.3對(duì)象的定義2.在聲明類類型的同時(shí)定義對(duì)象classStudent{private:
intid;
char
name[20];
char
major[20];floatfees;public:
void
register() {
cin>>id>>name>>major>>fees; }}stud1,stud2;
//定義了兩個(gè)Student類的對(duì)象在定義Student類的同時(shí),定義了兩個(gè)Student類的對(duì)象。Logo8.2.3對(duì)象的定義2.在聲明類類型的同時(shí)定義對(duì)象Log378.2.3對(duì)象的定義3.不出現(xiàn)類名,直接定義對(duì)象class
//無類名{private://聲明以下部分為私有的 ...
public://聲明以下部分為公用的 ...}stud1,stud2; //定義了兩個(gè)無類名的類對(duì)象這種方法很少用。在實(shí)際的程序開發(fā)中,一般都采用第1種方法。在定義一個(gè)對(duì)象時(shí),編譯系統(tǒng)會(huì)為這個(gè)對(duì)象分配存儲(chǔ)空間,以存放對(duì)象中的成員。Logo8.2.3對(duì)象的定義3.不出現(xiàn)類名,直接定義對(duì)象Logo388.3類的成員函數(shù)8.3.1成員函數(shù)的性質(zhì)類的成員函數(shù)與一般函數(shù)的區(qū)別只是:它是屬于一個(gè)類的成員,出現(xiàn)在類體中。可以指定為private、public、protected成員函數(shù)可以訪問本類中任何成員(包括私有和公用數(shù)據(jù)和函數(shù)成員)。Logo8.3類的成員函數(shù)8.3.1成員函數(shù)的性質(zhì)Logo398.3類的成員函數(shù)如何指定類的成員函數(shù)為public還是private?(1)一般將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對(duì)外接口。(2)不被外界調(diào)用的,而只是為本類中的成員函數(shù)所調(diào)用的函數(shù),應(yīng)指定為private。這種函數(shù)的作用是支持其他函數(shù)的操作,是類中其他成員的工具函數(shù),類外用戶不能調(diào)用這些私有的工具函數(shù)。
Logo8.3類的成員函數(shù)如何指定類的成員函數(shù)為public還是p408.3.2在類外定義成員函數(shù)成員函數(shù)可以在類體中定義,也可以在類外定義。如果是在類外定義,類體中只寫成員函數(shù)的聲明,具體函數(shù)定義而在類的外面進(jìn)行。如:classStudent{private:
intid;
char
name[20];
char
major[20];
floatfees;public:
void
register();//此處只做成員函數(shù)聲明};void
Student::
register()//成員函數(shù)的具體定義{
cin>>id>>name>>major>>fees;
}Logo8.3.2在類外定義成員函數(shù)成員函數(shù)可以在類418.3.2在類外定義成員函數(shù)注意:類體中定義函數(shù)時(shí),不需要在函數(shù)名前面加上類名,因?yàn)楹瘮?shù)屬于哪一個(gè)類是不言而喻的。成員函數(shù)在類外定義時(shí),必須在函數(shù)名前面加上類名,予以限定(qualifed),“∷”是作用域限定符(fieldqualifier)或稱作用域運(yùn)算符,用它聲明函數(shù)是屬于哪個(gè)類的。如果在作用域運(yùn)算符“∷”的前面沒有類名,或者函數(shù)名前面既無類名又無作用域運(yùn)算符“∷”,如 ∷display()
或display()則表示display函數(shù)不屬于任何類,這個(gè)函數(shù)不是成員函數(shù),而是全局函數(shù),即一般普通函數(shù)。Logo8.3.2在類外定義成員函數(shù)注意:Logo428.3.2在類外定義成員函數(shù)注意:類體中作原型聲明,然后在類外定義,類體的位置應(yīng)在函數(shù)定義之前,否則編譯時(shí)會(huì)出錯(cuò)。在類的內(nèi)部對(duì)成員函數(shù)作聲明,而在類體外定義成員函數(shù),這是程序設(shè)計(jì)的一種良好習(xí)慣。Logo8.3.2在類外定義成員函數(shù)注意:Logo438.3.4成員函數(shù)的存儲(chǔ)方式用一段空間存放共同的函數(shù)代碼段,在調(diào)用各對(duì)象的函數(shù)時(shí),都去調(diào)用這個(gè)公用的函數(shù)代碼。每個(gè)對(duì)象占用的存儲(chǔ)空間只是該對(duì)象的數(shù)據(jù)部分所占用的存儲(chǔ)空間,而不包括函數(shù)代碼所占用的存儲(chǔ)空間。Logo8.3.4成員函數(shù)的存儲(chǔ)方式用一段空間存放共同的函數(shù)代碼段44一個(gè)對(duì)象所占的空間大小只取決于該對(duì)象中數(shù)據(jù)成員所占的空間,而與成員函數(shù)無關(guān)。函數(shù)代碼是存儲(chǔ)在對(duì)象空間之外的。#include<iostream>usingnamespacestd;class
Time{
inthour; intminute; intsec;
public: voidset() {cin>>hour>>minute>>sec;}};intmain(){
cout<<sizeof(Time)<<endl;return0;}Logo一個(gè)對(duì)象所占的空間大小只取決于該對(duì)象中數(shù)據(jù)成員所占的空間,而458.4對(duì)象成員的引用在程序中經(jīng)常需要訪問對(duì)象中的成員。訪問對(duì)象中的成員可以有3種方法:
通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員;通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員;通過對(duì)象的引用變量訪問對(duì)象中的成員。Logo8.4對(duì)象成員的引用在程序中經(jīng)常需要訪問對(duì)象中468.4.1通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員訪問對(duì)象中成員的一般形式:
對(duì)象名.成員名不僅可以在類外引用對(duì)象的公用數(shù)據(jù)成員,而且還可以調(diào)用對(duì)象的公用成員函數(shù),但同樣必須指出對(duì)象名,如stud1.
register()
;//正確,調(diào)用對(duì)象stud1的公用成員函數(shù)register();//錯(cuò)誤,沒有指明是哪一個(gè)對(duì)象的register函數(shù)由于沒有指明對(duì)象名,編譯時(shí)把register()作為普通函數(shù)處理。Logo8.4.1通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員訪問對(duì)象中478.4對(duì)象成員的引用只能訪問public成員,而不能訪問private成員,如果已定義id為私有數(shù)據(jù)成員,下面的語句是錯(cuò)誤的:stud1.id=10101;
//num是私有數(shù)據(jù)成員,不能被外界引用在類外只能調(diào)用公用的成員函數(shù)。在一個(gè)類中應(yīng)當(dāng)至少有一個(gè)公用的成員函數(shù),作為對(duì)外的接口,否則就無法對(duì)對(duì)象進(jìn)行任何操作。Logo8.4對(duì)象成員的引用只能訪問public成員,而不能訪問p488.4.2通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員如果有以下程序段:classTime{public:
//數(shù)據(jù)成員是公用的inthour;intminute;};Timet,*p;//定義對(duì)象t和指針變量pp=&t;
//使p指向?qū)ο髏cout<<p->hour;
//輸出p指向的對(duì)象中的成員hour在p指向t的前提下,p->hour,(*p).hour和t.hour三者等價(jià)。Logo8.4.2通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員如果有以下程序498.4.3通過對(duì)象的引用變量來訪問對(duì)象中的成員如果已聲明了Time類,并有以下定義語句:Timet1;//定義對(duì)象t1Time&t2=t1;
//定義Time類引用變量t2,并使之初始化為t1cout<<t2.hour;
//輸出對(duì)象t1中的成員hourt2與t1共占同一段存儲(chǔ)單元(即t2是t1的別名),因此t2.hour就是t1.hour。Logo8.4.3通過對(duì)象的引用變量來訪問對(duì)象中的成員如果已聲明了508.5類和對(duì)象的簡單應(yīng)用舉例例8.1最簡單的例子。#include<iostream>usingnamespacestd;classTime
{public://數(shù)據(jù)成員為公用的
inthour;intminute;intsec;};intmain(){Time
t1;//定義t1為Time類對(duì)象cin>>t1.hour;//輸入設(shè)定的時(shí)間cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;return0;}Logo8.5類和對(duì)象的簡單應(yīng)用舉例例8.1最簡單的例子。Logo51例8.2引用多個(gè)對(duì)象的成員。(1)程序(a)#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Time
t1;//定義對(duì)象t1cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;Time
t2;//定義對(duì)象t2cin>>t2.hour;//向t2的數(shù)據(jù)成員輸入數(shù)據(jù)cin>>t2.minute;cin>>t2.sec;cout<<t2.hour<<″:″<<t2.minute<<″:″<<t2.sec<<endl;return0;}Logo例8.2引用多個(gè)對(duì)象的成員。(1)程序(a)#inclu52例8.2引用多個(gè)對(duì)象的成員。(1)程序(a)#include<iostream>usingnamespacestd;class
Time{public:inthour;intminute;intsec;};intmain(){voidset_time(Time&);//函數(shù)聲明voidshow_time(Time&);//函數(shù)聲明Time
t1;//定義t1為Time類對(duì)象set_time(t1);//調(diào)用函數(shù),向t1對(duì)象中的數(shù)據(jù)成員輸入數(shù)據(jù)show_time(t1);//調(diào)用show_time函數(shù),輸出t1對(duì)象中的數(shù)據(jù)Logo例8.2引用多個(gè)對(duì)象的成員。(1)程序(a)#inclu53Time
t2;//定義t2為Time類對(duì)象set_time(t2);show_time(t2);return0;}voidset_time(Time&t)
//定義函數(shù)set_time,形參t是引用變量{
cin>>t.hour;//輸入設(shè)定的時(shí)間
cin>>t.minute;cin>>t.sec;}voidshow_time(Time&t)
//定義函數(shù)show_time,形參t是引用變量{cout<<t.hour<<″:″<<t.minute<<″:″<<t.sec<<endl;//輸出對(duì)象中的數(shù)據(jù)}LogoTimet2;//定義54例8.3將例8.2的程序改用含成員函數(shù)的類來處理。#include<iostream>usingnamespacestd;class
Time{public:voidset_time();//公用成員函數(shù)voidshow_time();//公用成員函數(shù)private://數(shù)據(jù)成員為私有inthour;intminute;intsec;};Logo例8.3將例8.2的程序改用含成員函數(shù)的類來處理。#inc55intmain(){Time
t1;//定義對(duì)象t1t1.set_time();//調(diào)用對(duì)象t1的成員函數(shù)set_time,向t1的數(shù)據(jù)成員輸入數(shù)據(jù)t1.show_time();//調(diào)用對(duì)象t1的成員函數(shù)show_time,輸出t1的數(shù)據(jù)成員的值Timet2;//定義對(duì)象t2t2.set_time();t2.show_time();return0;}voidTime∷set_time()//在類外定義set_time函數(shù){
cin>>hour;cin>>minute;cin>>sec;}voidTime∷show_time()//在類外定義show_time函數(shù){
cout<<hour<<″:″<<minute<<″:″<<sec<<endl;}Logointmain()Logo56#include<iostream>usingnamespacestd;classTime{voidset_time(void);voidshow_time(void);inthour;intminute;intsec;};Timet;intmain(){set_time();show_time();return0;}intset_time(void){cin>>t.hour;cin>>t.minute;cin>>t.sec;}intshow_time(void){cout<<t.hour<<":"<<t.minute<<":"<<t.sec<<endl;}P261第1題Logo#include<iostream>P261第1題Logo57P261第2題P261第3題LogoP261第2題P261第3題Logo588.6類的封裝性和信息隱蔽8.6.1公用接口與私有實(shí)現(xiàn)的分離從前面的介紹已知:C++通過類來實(shí)現(xiàn)封裝性,把數(shù)據(jù)和與這些數(shù)據(jù)有關(guān)的操作封裝在一個(gè)類中,或者說,類的作用是把數(shù)據(jù)和算法封裝在用戶聲明的抽象數(shù)據(jù)類型中。在聲明了一個(gè)類以后,用戶主要是通過調(diào)用公用的成員函數(shù)來實(shí)現(xiàn)類提供的功能(例如對(duì)數(shù)據(jù)成員設(shè)置值,顯示數(shù)據(jù)成員的值,對(duì)數(shù)據(jù)進(jìn)行加工等)。因此,公用成員函數(shù)是用戶使用類的公用接口(publicinterface),或者說是類的對(duì)外接口。Logo8.6類的封裝性和信息隱蔽8.6.1公用接口與私有實(shí)現(xiàn)的598.6類的封裝性和信息隱蔽類中被操作的數(shù)據(jù)是私有的,實(shí)現(xiàn)的細(xì)節(jié)對(duì)用戶是隱蔽的,這種實(shí)現(xiàn)稱為私有實(shí)現(xiàn)(privateimplementation)。這種“類的公用接口與私有實(shí)現(xiàn)的分離”形成了信息隱蔽。軟件工程的一個(gè)最基本的原則就是將接口與實(shí)現(xiàn)分離,信息隱蔽是軟件工程中一個(gè)非常重要的概念。它的好處在于:(1)如果想修改或擴(kuò)充類的功能,只需修改本類中有關(guān)的數(shù)據(jù)成員和與它有關(guān)的成員函數(shù),程序中類外的部分可以不必修改。(2)如果在編譯時(shí)發(fā)現(xiàn)類中的數(shù)據(jù)讀寫有錯(cuò),不必檢查整個(gè)程序,只需檢查本類中訪問這些數(shù)據(jù)的少數(shù)成員函數(shù)。Logo8.6類的封裝性和信息隱蔽類中被操作的數(shù)608.6.2類聲明和成員函數(shù)定義的分離在面向?qū)ο蟮某绦蜷_發(fā)中,一般做法是將類的聲明(其中包含成員函數(shù)的聲明)放在指定的頭文件中,用戶如果想用該類,只要把有關(guān)的頭文件包含進(jìn)來即可,不必在程序中重復(fù)書寫類的聲明,以減少工作量,節(jié)省篇幅,提高編程的效率。由于在頭文件中包含了類的聲明,因此在程序中就可以用該類來定義對(duì)象。由于在類體中包含了對(duì)成員函數(shù)的聲明,在程序中就可以調(diào)用這些對(duì)象的公用成員函數(shù)。為了實(shí)現(xiàn)信息隱蔽,對(duì)類成員函數(shù)的定義一般不放在頭文件中,而另外放在一個(gè)文件中。Logo8.6.2類聲明和成員函數(shù)定義的分離在面向?qū)?18.6.2類聲明和成員函數(shù)定義的分離例如,可以分別寫兩個(gè)文件://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(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}Logo8.6.2類聲明和成員函數(shù)定義的分離例如,可以分別寫兩個(gè)文628.6.2類聲明和成員函數(shù)定義的分離為了組成一個(gè)完整的源程序,還應(yīng)當(dāng)有包括主函數(shù)的源文件://main.cpp
主函數(shù)模塊#include<iostream>#include″student.h″//將類聲明頭文件包含進(jìn)來intmain(){Studentstud;//定義對(duì)象stud.display();//執(zhí)行stud對(duì)象的display函數(shù)return0;}這是一個(gè)包括3個(gè)文件的程序,組成兩個(gè)文件模塊:一個(gè)是主模塊main.cpp,一個(gè)是student.cpp。在主模塊中又包含頭文件student.h。在預(yù)編譯時(shí)會(huì)將頭文件student.h中的內(nèi)容取代#include″student.h″行。Logo8.6.2類聲明和成員函數(shù)定義的分離為了組638.6.2類聲明和成員函數(shù)定義的分離請(qǐng)注意:由于將頭文件student.h放在用戶當(dāng)前目錄中,因此在文件名兩側(cè)用雙撇號(hào)包起來(″student.h″)而不用尖括號(hào)(<student.h>),否則編譯時(shí)會(huì)找不到此文件。Logo8.6.2類聲明和成員函數(shù)定義的分離請(qǐng)注意:64Thankyou本章到此結(jié)束Thankyou本章到此結(jié)束65第8章類和對(duì)象C++程序設(shè)計(jì)第8章類和對(duì)象C++程序設(shè)計(jì)66本章內(nèi)容8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述8.2類的聲明和對(duì)象的定義8.3類的成員函數(shù)8.4對(duì)象成員的引用8.5類和對(duì)象的簡單應(yīng)用舉例8.6類的封裝性和信息隱蔽Logo本章內(nèi)容8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo678.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述
面向?qū)ο蟪绦蛟O(shè)計(jì):把同一對(duì)象的數(shù)據(jù)和操作封裝在一起,使用對(duì)象、類、繼承、封裝、消息等基本概念來進(jìn)行的程序設(shè)計(jì)。例如:人們生產(chǎn)汽車時(shí),發(fā)動(dòng)機(jī)、底盤、車身和輪子分別由不同生產(chǎn)廠商設(shè)計(jì)和制造,最后由汽車制造商組裝在一起。在組裝時(shí),各部分之間有一定的聯(lián)系,以便協(xié)調(diào)工作,各部分內(nèi)部如何工作一無所知。為了進(jìn)一步說明問題,下面先討論幾個(gè)有關(guān)的概念。OO=對(duì)象+類+消息+繼承+封裝+多態(tài)Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述面向?qū)ο蟪绦蛟O(shè)計(jì)688.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象
對(duì)象是具有明顯邊界和含義的概念、抽象或事物,一個(gè)對(duì)象代表了一個(gè)現(xiàn)實(shí)的或虛擬的實(shí)體。自然實(shí)體概念實(shí)體軟件實(shí)體化學(xué)過程連接顯示Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象自然實(shí)體化學(xué)過程698.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象對(duì)象(Object)是包含客觀世界物體特征的抽象實(shí)體,客觀世界中任何一個(gè)事物都可以看成一個(gè)對(duì)象。對(duì)象可大可小。對(duì)象是構(gòu)成系統(tǒng)的基本單位。對(duì)象由屬性(Attribute)和行為(Action)兩部分組成。對(duì)象的兩個(gè)要素:屬性和行為。屬性:對(duì)象的特征,定義成員變量描述。行為:對(duì)象的動(dòng)作,定義成員函數(shù)完成。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述1.對(duì)象Logo708.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象屬性舉例:一個(gè)學(xué)生對(duì)象屬性:姓名、號(hào)碼、性別、職業(yè)、年級(jí)。一個(gè)教師對(duì)象屬性:姓名、號(hào)碼、性別、職業(yè)、職務(wù)。一臺(tái)錄像機(jī)對(duì)象屬性:型號(hào)、品牌、體積、重量、價(jià)格。一臺(tái)筆記本電腦對(duì)象的屬性:?Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象屬性舉例:Logo718.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象行為舉例:一個(gè)學(xué)生對(duì)象行為:聽課、交作業(yè)、考試。一個(gè)教師對(duì)象行為:講課、改作業(yè)、監(jiān)考。一臺(tái)錄像機(jī)對(duì)象行為:錄像、播放、暫停、快進(jìn)、停止。一臺(tái)筆記本電腦的行為:?Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述對(duì)象行為舉例:Logo728.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述在一個(gè)系統(tǒng)中的多個(gè)對(duì)象之間通過一定的渠道相互聯(lián)系,如圖8.1示意。要使某一個(gè)對(duì)象實(shí)現(xiàn)某一種行為(即操作),應(yīng)當(dāng)向它傳送相應(yīng)的消息。對(duì)象之間就是這樣通過發(fā)送和接收消息互相聯(lián)系的。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述在一個(gè)系統(tǒng)中738.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類每一個(gè)實(shí)體都是對(duì)象。有一些對(duì)象是具有相同的結(jié)構(gòu)和行為的。每個(gè)對(duì)象都屬于一個(gè)特定的類型。類(Class)是一組具有相同結(jié)構(gòu)和行為的對(duì)象的集合。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類Logo748.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類類的舉例:學(xué)生類、教師類、錄像機(jī)、筆記本電腦、汽車、飲料、氣體、礦石、人、動(dòng)物…….如:10個(gè)不同尺寸的三角形是10個(gè)對(duì)象。這10個(gè)三角形對(duì)象有相同的屬性結(jié)構(gòu)和行為,可以將它們抽象為一種類型,稱為三角形類型。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述2、類如:10個(gè)不同尺寸的758.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽封裝:將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個(gè)對(duì)象中,形成一個(gè)基本單位,各個(gè)對(duì)象之間相對(duì)獨(dú)立,互不干擾。信息隱蔽:將對(duì)象中某些部分對(duì)外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留少量接口,以便與外界聯(lián)系,接收外界的消息。信息隱蔽有利于數(shù)據(jù)安全,防止無關(guān)的人了解和修改數(shù)據(jù)。封裝可以降低復(fù)雜度和出錯(cuò)的可能性,提高類或模塊的可重用性、隱藏性,使用方便,易于維護(hù)。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽封裝可768.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述3.封裝與信息隱蔽Log778.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述4.繼承與派生
繼承是一種由已有的類創(chuàng)建新類的機(jī)制。子類從父類繼承了共性,又派生出自己的各自的特性。父類--子類(派生類)
將門虎子——繼承Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述4.繼承與派生Logo78LogoLogo798.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo808.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述Logo818.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述
父類別可以被多個(gè)子類別繼承,子類別也可以是別的類的父類,從而建立類繼承的層次結(jié)構(gòu)。Cow類Lion類Tiger類Animals類Carnivorous類Herbivorous類Coat類Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述父類別可以被828.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述C++提供了繼承機(jī)制,采用繼承的方法可以很方便地利用一個(gè)已有的類建立一個(gè)新的類。這就是常說的“軟件重用”(softwarereusability)的思想。繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不能完全解決)時(shí),需要對(duì)原有程序進(jìn)行改造。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述C++提供了繼838.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述5.多態(tài)性由繼承而產(chǎn)生的相關(guān)的不同的類,其對(duì)象對(duì)同一消息會(huì)作出不同的響應(yīng)。如:動(dòng)物都會(huì)叫,但不同的動(dòng)物的叫聲不同。如:在Windows環(huán)境下,用鼠標(biāo)雙擊一個(gè)文件對(duì)象(這就是向?qū)ο髠魉鸵粋€(gè)消息),根據(jù)文件對(duì)象的不同,將做不同的操作。如果是可執(zhí)行文件,則會(huì)執(zhí)行此程序;如果是文本文件,則啟動(dòng)文本編輯器并打開該文件。Logo8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述5.多態(tài)性Logo848.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)面對(duì)的是一個(gè)個(gè)對(duì)象。程序設(shè)計(jì)者的任務(wù)包括兩個(gè)方面:
(1)設(shè)計(jì)所需的各種類和對(duì)象,即決定把哪些數(shù)據(jù)和操作封裝在一起;(2)考慮怎樣向有關(guān)對(duì)象發(fā)送消息,以完成所需的任務(wù)。這時(shí)他如同一個(gè)總調(diào)度,不斷地向各個(gè)對(duì)象發(fā)出命令,讓這些對(duì)象活動(dòng)起來(或者說激活這些對(duì)象),完成自己職責(zé)范圍內(nèi)的工作。各個(gè)對(duì)象的操作完成了,整體任務(wù)也就完成了。顯然,對(duì)一個(gè)大型任務(wù)來說,面向?qū)ο蟪绦蛟O(shè)計(jì)方法是十分有效的,它能大大降低程序設(shè)計(jì)人員的工作難度,減少出錯(cuò)機(jī)會(huì)。Logo8.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)面向?qū)ο蟪绦蛟O(shè)計(jì)面對(duì)的是一858.1.4面向?qū)ο蟮能浖_發(fā)
隨著軟件規(guī)模的迅速增大,軟件人員面臨的問題十分復(fù)雜。需要規(guī)范整個(gè)軟件開發(fā)過程,明確軟件開發(fā)過程中每個(gè)階段的任務(wù),在保證前一個(gè)階段工作的正確性的情況下,再進(jìn)行下一階段的工作。這就是軟件工程學(xué)需要研究和解決的問題。面向?qū)ο蟮能浖こ贪ㄒ韵聨讉€(gè)部分:Logo8.1.4面向?qū)ο蟮能浖_發(fā)隨著軟件規(guī)模的868.1.4面向?qū)ο蟮能浖_發(fā)Logo8.1.4面向?qū)ο蟮能浖_發(fā)Logo878.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系每一個(gè)對(duì)象都是某一個(gè)類的實(shí)例;每一個(gè)類在某一時(shí)刻都有零個(gè)或更多的實(shí)例;類是靜態(tài)的,它們的存在、語義和關(guān)系在程序執(zhí)行前就已經(jīng)定義好了;對(duì)象是動(dòng)態(tài)的,它們?cè)诔绦驁?zhí)行時(shí)可以被創(chuàng)建和刪除;類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。在一開始時(shí)弄清對(duì)象和類的關(guān)系是十分重要的。Logo8.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系Logo888.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系白馬非馬——對(duì)象和類這是中國古代偉大的邏輯學(xué)家公孫龍(約公元前320--250年)提出的一個(gè)著名的邏輯問題,出自《公孫龍子·白馬論》。類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例。Logo8.2類的聲明和對(duì)象的定義8.2.1對(duì)象和類的關(guān)系類是對(duì)象898.2類的聲明和對(duì)象的定義
8.2.2類的聲明在C++中聲明一個(gè)類類型和聲明一個(gè)結(jié)構(gòu)體類型是相似的。以前,定義結(jié)構(gòu)體類型,描述一個(gè)對(duì)象:struct
Student
{intnum;charname[20];charsex;};Studentstud1,stud2;//定義了兩個(gè)結(jié)構(gòu)體變量stud1和stud2我們把一個(gè)對(duì)象可能具有的動(dòng)作,加入到對(duì)象的描述中,就形成了類。Logo8.2類的聲明和對(duì)象的定義8.2.2類的聲明我們把一個(gè)對(duì)象908.2.2類的聲明class
Student//以class開頭{intnum;charname[20];charsex;//以上3行是數(shù)據(jù)成員voiddisplay()//這是成員函數(shù){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;
//以上4行是函數(shù)中的操作語句}};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象stud1和stud2可以看到聲明類的方法是由聲明結(jié)構(gòu)體類型的方法發(fā)展而來的。Logo8.2.2類的聲明classStudent918.2.2類的聲明class<類名>{[[private:]//私有成員,缺省存取權(quán)限 <數(shù)據(jù)成員及成員函數(shù)
>][public://公有成員 <數(shù)據(jù)成員及成員函數(shù)
>][protected://保護(hù)成員 <數(shù)據(jù)成員及成員函數(shù)
>]};Logo8.2.2類的聲明class<類名>Logo928.2.2類的聲明類一經(jīng)定義就形成了邊界,達(dá)成了封裝,就像建了一幢房子訪問修飾符的作用就是在房子上開窗,開門,讓別人可以訪問。訪問修飾符Logo8.2.2類的聲明類一經(jīng)定義就形成了邊界,達(dá)成了封裝,就像938.2.2類的聲明訪問修飾符不受任何限制,本類或非本類均可隨意訪問。public本類及其子類可以訪問(父子友好),同一個(gè)包中的其它類也可訪問(包內(nèi)友好)。protected只有相同包中的類可以訪問(包內(nèi)友好)。缺省只有本類可以訪問,其余都不可以。privateLogo8.2.2類的聲明訪問修飾符不受任何限制,本類或非本類均可948.2.2類的聲明publicprotectedprivate本類可以可以可以同包子類可以可以不可以同包非子類可以可以不可以不同包子類可以可以不可以不同包且非子類可以不可以不可以訪問修飾符Logo8.2.2類的聲明publicprotectedpriva958.2.2類的聲明注意:
(1)在聲明類類型時(shí),聲明為private的成員和聲明為public的成員的次序任意,既可以先出現(xiàn)private部分,也可以先出現(xiàn)public部分。(2)如果在類體中既不寫關(guān)鍵字private,又不寫public,就默認(rèn)為private。(3)在一個(gè)類體中,關(guān)鍵字private和public可以分別出現(xiàn)多次。每個(gè)部分的有效范圍到出現(xiàn)另一個(gè)訪問限定符或類體結(jié)束時(shí)(最后一個(gè)右花括號(hào))為止。但是為了使程序清晰,應(yīng)該養(yǎng)成這樣的習(xí)慣:使每一種成員訪問限定符在類定義體中只出現(xiàn)一次。Logo8.2.2類的聲明注意:Logo968.2.2類的聲明可以將上面類Student的聲明改為class
Student//聲明類類型{
private://聲明以下部分為私有的intnum;charname[20];charsex;public://聲明以下部分為公用的voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}
};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象Logo8.2.2類的聲明可以將上面類Student的聲明改為Lo978.2.2類的聲明不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起來,而把成員函數(shù)作為對(duì)外界的接口。Logo8.2.2類的聲明不能把類中的全部成員與外界隔離,一般是把988.2.3對(duì)象的定義private:idnamemajorfeespublic:registerStudent類對(duì)象stu10521140張三Computer16000register對(duì)象stu10522240李四Network16000registerLogo8.2.3對(duì)象的定義private:public:Stu998.2.3對(duì)象的定義1.先聲明類類型,然后再定義對(duì)象聲明了類類型后,定義對(duì)象有兩種形式。(1)class
類名
對(duì)象名
classStudentstud1,stud2;把class和Student合起來作為一個(gè)類名,用來定義對(duì)象。(2)類名
對(duì)象名
Studentstud1,stud2;直接用類名定義對(duì)象。這兩種方法是等效的。Logo8.2.3對(duì)象的定義1.先聲明類類型,然后再定義對(duì)象Lo1008.2.3對(duì)象的定義classStudent{private:
intid;
char
name[20];
char
major[20];
floatfees;public:
void
register() {
cin>>id>>name>>major>>fees; }};
Studentstu1,stu2;Logo8.2.3對(duì)象的定義classStudentLogo1018.2.3對(duì)象的定義2.在聲明類類型的同時(shí)定義對(duì)象classStudent{private:
intid;
char
name[20];
char
major[20];floatfees;public:
void
register() {
cin>>id>>name>>major>>fees; }}stud1,stud2;
//定義了兩個(gè)Student類的對(duì)象在定義Student類的同時(shí),定義了兩個(gè)Student類的對(duì)象。Logo8.2.3對(duì)象的定義2.在聲明類類型的同時(shí)定義對(duì)象Log1028.2.3對(duì)象的定義3.不出現(xiàn)類名,直接定義對(duì)象class
//無類名{private://聲明以下部分為私有的 ...
public://聲明以下部分為公用的 ...}stud1,stud2; //定義了兩個(gè)無類名的類對(duì)象這種方法很少用。在實(shí)際的程序開發(fā)中,一般都采用第1種方法。在定義一個(gè)對(duì)象時(shí),編譯系統(tǒng)會(huì)為這個(gè)對(duì)象分配存儲(chǔ)空間,以存放對(duì)象中的成員。Logo8.2.3對(duì)象的定義3.不出現(xiàn)類名,直接定義對(duì)象Logo1038.3類的成員函數(shù)8.3.1成員函數(shù)的性質(zhì)類的成員函數(shù)與一般函數(shù)的區(qū)別只是:它是屬于一個(gè)類的成員,出現(xiàn)在類體中??梢灾付閜rivate、public、protected成員函數(shù)可以訪問本類中任何成員(包括私有和公用數(shù)據(jù)和函數(shù)成員)。Logo8.3類的成員函數(shù)8.3.1成員函數(shù)的性質(zhì)Logo1048.3類的成員函數(shù)如何指定類的成員函數(shù)為public還是private?(1)一般將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對(duì)外接口。(2)不被外界調(diào)用的,而只是為本類中的成員函數(shù)所調(diào)用的函數(shù),應(yīng)指定為private。這種函數(shù)的作用是支持其他函數(shù)的操作,是類中其他成員的工具函數(shù),類外用戶不能調(diào)用這些私有的工具函數(shù)。
Logo8.3類的成員函數(shù)如何指定類的成員函數(shù)為public還是p1058.3.2在類外定義成員函數(shù)成員函數(shù)可以在類體中定義,也可以在類外定義。如果是在類外定義,類體中只寫成員函數(shù)的聲明,具體函數(shù)定義而在類的外面進(jìn)行。如:classStudent{private:
intid;
char
name[20];
char
major[20];
floatfees;public:
void
register();//此處只做成員函數(shù)聲明};void
Student::
register()//成員函數(shù)的具體定義{
cin>>id>>name>>major>>fees;
}Logo8.3.2在類外定義成員函數(shù)成員函數(shù)可以在類1068.3.2在類外定義成員函數(shù)注意:類體中定義函數(shù)時(shí),不需要在函數(shù)名前面加上類名,因?yàn)楹瘮?shù)屬于哪一個(gè)類是不言而喻的。成員函數(shù)在類外定義時(shí),必須在函數(shù)名前面加上類名,予以限定(qualifed),“∷”是作用域限定符(fieldqualifier)或稱作用域運(yùn)算符,用它聲明函數(shù)是屬于哪個(gè)類的。如果在作用域運(yùn)算符“∷”的前面沒有類名,或者函數(shù)名前面既無類名又無作用域運(yùn)算符“∷”,如 ∷display()
或display()則表示display函數(shù)不屬于任何類,這個(gè)函數(shù)不是成員函數(shù),而是全局函數(shù),即一般普通函數(shù)。Logo8.3.2在類外定義成員函數(shù)注意:Logo1078.3.2在類外定義成員函數(shù)注意:類體中作原型聲明,然后在類外定義,類體的位置應(yīng)在函數(shù)定義之前,否則編譯時(shí)會(huì)出錯(cuò)。在類的內(nèi)部對(duì)成員函數(shù)作聲明,而在類體外定義成員函數(shù),這是程序設(shè)計(jì)的一種良好習(xí)慣。Logo8.3.2在類外定義成員函數(shù)注意:Logo1088.3.4成員函數(shù)的存儲(chǔ)方式用一段空間存放共同的函數(shù)代碼段,在調(diào)用各對(duì)象的函數(shù)時(shí),都去調(diào)用這個(gè)公用的函數(shù)代碼。每個(gè)對(duì)象占用的存儲(chǔ)空間只是該對(duì)象的數(shù)據(jù)部分所占用的存儲(chǔ)空間,而不包括函數(shù)代碼所占用的存儲(chǔ)空間。Logo8.3.4成員函數(shù)的存儲(chǔ)方式用一段空間存放共同的函數(shù)代碼段109一個(gè)對(duì)象所占的空間大小只取決于該對(duì)象中數(shù)據(jù)成員所占的空間,而與成員函數(shù)無關(guān)。函數(shù)代碼是存儲(chǔ)在對(duì)象空間之外的。#include<iostream>usingnamespacestd;class
Time{
inthour; intminute; intsec;
public: voidset() {cin>>hour>>minute>>sec;}};intmain(){
cout<<sizeof(Time)<<endl;return0;}Logo一個(gè)對(duì)象所占的空間大小只取決于該對(duì)象中數(shù)據(jù)成員所占的空間,而1108.4對(duì)象成員的引用在程序中經(jīng)常需要訪問對(duì)象中的成員。訪問對(duì)象中的成員可以有3種方法:
通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員;通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員;通過對(duì)象的引用變量訪問對(duì)象中的成員。Logo8.4對(duì)象成員的引用在程序中經(jīng)常需要訪問對(duì)象中1118.4.1通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員訪問對(duì)象中成員的一般形式:
對(duì)象名.成員名不僅可以在類外引用對(duì)象的公用數(shù)據(jù)成員,而且還可以調(diào)用對(duì)象的公用成員函數(shù),但同樣必須指出對(duì)象名,如stud1.
register()
;//正確,調(diào)用對(duì)象stud1的公用成員函數(shù)register();//錯(cuò)誤,沒有指明是哪一個(gè)對(duì)象的register函數(shù)由于沒有指明對(duì)象名,編譯時(shí)把register()作為普通函數(shù)處理。Logo8.4.1通過對(duì)象名和成員運(yùn)算符訪問對(duì)象中的成員訪問對(duì)象中1128.4對(duì)象成員的引用只能訪問public成員,而不能訪問private成員,如果已定義id為私有數(shù)據(jù)成員,下面的語句是錯(cuò)誤的:stud1.id=10101;
//num是私有數(shù)據(jù)成員,不能被外界引用在類外只能調(diào)用公用的成員函數(shù)。在一個(gè)類中應(yīng)當(dāng)至少有一個(gè)公用的成員函數(shù),作為對(duì)外的接口,否則就無法對(duì)對(duì)象進(jìn)行任何操作。Logo8.4對(duì)象成員的引用只能訪問public成員,而不能訪問p1138.4.2通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員如果有以下程序段:classTime{public:
//數(shù)據(jù)成員是公用的inthour;intminute;};Timet,*p;//定義對(duì)象t和指針變量pp=&t;
//使p指向?qū)ο髏cout<<p->hour;
//輸出p指向的對(duì)象中的成員hour在p指向t的前提下,p->hour,(*p).hour和t.hour三者等價(jià)。Logo8.4.2通過指向?qū)ο蟮闹羔樤L問對(duì)象中的成員如果有以下程序1148.4.3通過對(duì)象的引用變量來訪問對(duì)象中的成員如果已聲明了Time類,并有以下定義語句:Timet1;//定義對(duì)象t1Time&t2=t1;
//定義Time類引用變量t2,并使之初始化為t1cout<<t2.hour;
//輸出對(duì)象t1中的成員hourt2與t1共占同一段存儲(chǔ)單元(即t2是t1的別名),因此t2.hour就是t1.hour。Logo8.4.3通過對(duì)象的引用變量來訪問對(duì)象中的成員如果已聲明了1158.5類和對(duì)象的簡單應(yīng)用舉例例8.1最簡單的例子。#include<iostream>usingnamespacestd;classTime
{public://數(shù)據(jù)成員為公用的
inthour;intminute;intsec;};intmain(){Time
t1;//定義t1為Time類對(duì)象cin>>t1.hour;//輸入設(shè)定的時(shí)間cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;return0;}Logo8.5類和對(duì)象的簡單應(yīng)用舉例例8.1最簡單的例子。Logo116例8.2引用多個(gè)對(duì)象的成員。(1)程序(a)#include<iostream>usingnamespacestd;classTime{public:inthour;intminute;intsec;};intmain(){Time
t1;//定義對(duì)象t1cin>>t1.hour;cin>>t1.minute;cin>>t1.sec;cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;Time
t2;//定義對(duì)象t2cin>>t2.hour;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 政府采購超市供貨合同范例
- 機(jī)器加盟協(xié)議合同范例
- 個(gè)人勞務(wù)合同范例電子版
- 瓷磚美縫裝修合同范例
- 塑木施工合同范例
- 注塑外協(xié)加工合同范例
- 單梁吊合同范例
- 供熱工程實(shí)施合同范例
- 俄羅斯外貿(mào)合同范例
- 親屬房屋贈(zèng)送合同范例
- 禽類屠宰行業(yè)競爭力提升策略
- 從文學(xué)到電影智慧樹知到期末考試答案章節(jié)答案2024年山東大學(xué)
- 腹腔鏡下輸尿管膀胱再植術(shù)后護(hù)理查房
- AQ/T 1119-2023 煤礦井下人員定位系統(tǒng)通 用技術(shù)條件(正式版)
- 體育賽事組織流程圖所有
- 污水工程首件開工報(bào)告
- 2024-2034年全球及中國年糕行業(yè)市場發(fā)展分析及前景趨勢(shì)與投資發(fā)展研究報(bào)告
- 烈士陵園的數(shù)字化轉(zhuǎn)型與智能服務(wù)
- 醫(yī)院與陪護(hù)公司的協(xié)議范文
- 古琴介紹(英文)(部編)課件
- DL-T5704-2014火力發(fā)電廠熱力設(shè)備及管道保溫防腐施工質(zhì)量驗(yàn)收規(guī)程
評(píng)論
0/150
提交評(píng)論