c++8上海交大(針對(duì)譚浩強(qiáng)的書)_第1頁(yè)
c++8上海交大(針對(duì)譚浩強(qiáng)的書)_第2頁(yè)
c++8上海交大(針對(duì)譚浩強(qiáng)的書)_第3頁(yè)
c++8上海交大(針對(duì)譚浩強(qiáng)的書)_第4頁(yè)
c++8上海交大(針對(duì)譚浩強(qiáng)的書)_第5頁(yè)
已閱讀5頁(yè),還剩36頁(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)介

第八章類和對(duì)象計(jì)算機(jī)基礎(chǔ)教學(xué)研究室C++語(yǔ)言程序設(shè)計(jì)1主要內(nèi)容8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述8.2類的聲明和對(duì)象的定義8.3類的成員函數(shù)8.4對(duì)象成員的引用8.5類的封裝性和信息隱蔽8.6類和對(duì)象的簡(jiǎn)單應(yīng)用舉例2 到目前為止,我們介紹的是C++在面向過(guò)程的程序設(shè)計(jì)中的應(yīng)用。對(duì)于規(guī)模比較小的程序,編程者可以直接編寫出一個(gè)面向過(guò)程的程序,詳細(xì)地描述每一瞬時(shí)的數(shù)據(jù)結(jié)構(gòu)及對(duì)其的操作過(guò)程。但是當(dāng)程序規(guī)模較大時(shí),就顯得力不從心了。C++就是為了解決編寫大程序過(guò)程中的困難而產(chǎn)生的。8.1面向?qū)ο蟪绦蛟O(shè)計(jì)方法概述31.對(duì)象客觀世界中任何一個(gè)事物都可以看成一個(gè)對(duì)象(object)。對(duì)象可大可小。對(duì)象是構(gòu)成系統(tǒng)的基本單位。一個(gè)對(duì)象往往是由一組屬性和一組行為構(gòu)成的。一般來(lái)說(shuō),凡是具備屬性和行為這兩種要素的,都可以作為對(duì)象。2.封裝與信息隱蔽面向?qū)ο蟪绦蛟O(shè)計(jì)方法的一個(gè)重要特點(diǎn)就是“封裝性”(encapsulation),所謂“封裝”,指兩方面的含義:一、將有關(guān)的數(shù)據(jù)和操作代碼封裝在一個(gè)對(duì)象中,形成一個(gè)基本單位,各個(gè)對(duì)象之間相對(duì)獨(dú)立,互不干擾。二、將對(duì)象中某些部分對(duì)外隱蔽,即隱蔽其內(nèi)部細(xì)節(jié),只留下少量接口,以便與外界聯(lián)系,接收外界的消息。信息隱蔽還有利于數(shù)據(jù)安全,防止無(wú)關(guān)的人了解和修改數(shù)據(jù)。面向?qū)ο蟪绦蛟O(shè)計(jì)中的概念43.抽象 在程序設(shè)計(jì)方法中,常用到抽象(abstraction)這一名詞。抽象的過(guò)程是將有關(guān)事物的共性歸納、集中的過(guò)程。 抽象的作用是表示同一類事物的本質(zhì)。C++中的類就是對(duì)一批具體的數(shù)的抽象。 類是對(duì)象的抽象,而對(duì)象則是類的特例,或者說(shuō)是類的具體表現(xiàn)形式。4.繼承與重用 如果在軟件開(kāi)發(fā)中已經(jīng)建立了一個(gè)名為A的“類”,又想另外建立一個(gè)名為B的“類”,而后者與前者內(nèi)容基本相同,只是在前者的基礎(chǔ)上增加一些屬性和行為,只需在類A的基礎(chǔ)上增加一些新內(nèi)容即可。這就是面向?qū)ο蟪绦蛟O(shè)計(jì)中的繼承機(jī)制。利用繼承可以簡(jiǎn)化程序設(shè)計(jì)的步驟。

C++提供了繼承機(jī)制,采用繼承的方法可以很方便地利用一個(gè)已有的類建立一個(gè)新的類。這就是常說(shuō)的“軟件重用”的思想。55.多態(tài)性 如果有幾個(gè)相似而不完全相同的對(duì)象,有時(shí)人們要求在向它們發(fā)出同一個(gè)消息時(shí),它們的反應(yīng)各不相同,分別執(zhí)行不同的操作。這種情況就是多態(tài)現(xiàn)象。 如,在Windows環(huán)境下,用鼠標(biāo)雙擊一個(gè)文件對(duì)象(這就是向?qū)ο髠魉鸵粋€(gè)消息),如果對(duì)象是一個(gè)可執(zhí)行文件,則會(huì)執(zhí)行此程序,如果對(duì)象是一個(gè)文本文件,則啟動(dòng)文本編輯器并打開(kāi)該文件。 在C++中,所謂多態(tài)性(polymorphism)是指:由繼承而產(chǎn)生的相關(guān)的不同的類,其對(duì)象對(duì)同一消息會(huì)作出不同的響應(yīng)。 多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)重要特征,能增加程序的靈活性。6傳統(tǒng)的面向過(guò)程程序設(shè)計(jì)是圍繞功能進(jìn)行的,用一個(gè)函數(shù)實(shí)現(xiàn)一個(gè)功能。所有的數(shù)據(jù)都是公用的,一個(gè)函數(shù)可以使用任何一組數(shù)據(jù),而一組數(shù)據(jù)又能被多個(gè)函數(shù)所使用(見(jiàn)圖8.3)。圖8.38.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)的特點(diǎn)7面向?qū)ο蟪绦蛟O(shè)計(jì)采取的是另外一種思路。程序設(shè)計(jì)者的任務(wù)包括兩個(gè)方面:一是設(shè)計(jì)所需的各種類和對(duì)象,即決定把哪些數(shù)據(jù)和操作封裝在一起;二是考慮怎樣向有關(guān)對(duì)象發(fā)送消息,以完成所需的任務(wù)。這時(shí)它如同一個(gè)總調(diào)度,不斷地向各個(gè)對(duì)象發(fā)出命令,讓這些對(duì)象活動(dòng)起來(lái)(或者說(shuō)激活這些對(duì)象),完成自己職責(zé)范圍內(nèi)的工作。各個(gè)對(duì)象的操作完成了,整體任務(wù)也就完成了。顯然,對(duì)一個(gè)大型任務(wù)來(lái)說(shuō),面向?qū)ο蟪绦蛟O(shè)計(jì)方法是十分有效的,它利用代碼的重用,大大降低程序設(shè)計(jì)人員的工作難度,減少出錯(cuò)機(jī)會(huì)。8類是C++中十分重要的概念,它是實(shí)現(xiàn)面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)。類是所有面向?qū)ο蟮恼Z(yǔ)言的共同特征,所有面向?qū)ο蟮恼Z(yǔ)言都提供了這種類型。一個(gè)有一定規(guī)模的C++程序是由許多類所構(gòu)成的。

C++支持面向過(guò)程的程序設(shè)計(jì),又支持面向?qū)ο蟮某绦蛟O(shè)計(jì)。8.1.3類和對(duì)象的作用9面向?qū)ο蟮能浖こ淌敲嫦驅(qū)ο蠓椒ㄔ谲浖こ填I(lǐng)域的全面應(yīng)用。它包括:面向?qū)ο蟮姆治觯∣OA)面向?qū)ο蟮脑O(shè)計(jì)(OOD)面向?qū)ο蟮木幊蹋∣OP)Object-Oriented Programming面向?qū)ο蟮臏y(cè)試(OOT)面向?qū)ο蟮能浖S護(hù)(OOSM)8.1.4面向?qū)ο蟮能浖_(kāi)發(fā)10系統(tǒng)分析系統(tǒng)分析階段應(yīng)該扼要精確地抽象出系統(tǒng)必須做什么,但是不關(guān)心如何去實(shí)現(xiàn)。面向?qū)ο蟮南到y(tǒng)分析,直接用問(wèn)題域中客觀存在的事物建立模型中的對(duì)象,對(duì)單個(gè)事物及事物之間的關(guān)系,都保留他們的原貌,不做轉(zhuǎn)換,也不打破原有界限而重新組合,因此能夠很好地映射客觀事物。11設(shè)計(jì)針對(duì)系統(tǒng)的一個(gè)具體實(shí)現(xiàn)運(yùn)用面向?qū)ο蟮姆椒?怎么做?)。其中包括兩方面的工作:把OOA模型直接搬到OOD,作為OOD的一部分針對(duì)具體實(shí)現(xiàn)中的人機(jī)界面、數(shù)據(jù)存儲(chǔ)、任務(wù)管理等因素補(bǔ)充一些與實(shí)現(xiàn)有關(guān)的部分。12編程OOP工作就是用一種面向?qū)ο蟮木幊陶Z(yǔ)言把OOD模型中的每個(gè)成分書寫出來(lái),是面向?qū)ο蟮能浖_(kāi)發(fā)最終落實(shí)的重要階段。13測(cè)試測(cè)試的任務(wù)是發(fā)現(xiàn)軟件中的錯(cuò)誤。在面向?qū)ο蟮能浖y(cè)試中繼續(xù)運(yùn)用面向?qū)ο蟮母拍钆c原則來(lái)組織測(cè)試,以對(duì)象的類作為基本測(cè)試單位,可以更準(zhǔn)確的發(fā)現(xiàn)程序錯(cuò)誤并提高測(cè)試效率。從執(zhí)行被測(cè)軟件的角度:分為靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試 若按照功能分:分為白盒測(cè)試(結(jié)構(gòu))和黑盒測(cè)試(功能)軟件測(cè)試過(guò)程:單元測(cè)試、集成測(cè)試、驗(yàn)收測(cè)試(確認(rèn))和系統(tǒng)測(cè)試。軟件調(diào)試方法:強(qiáng)行排錯(cuò)法、回溯法、原因排除法。14維護(hù)將軟件交付使用后,工作并沒(méi)有完結(jié),還要根據(jù)軟件的運(yùn)行情況和用戶的需求,不斷改進(jìn)系統(tǒng)。使用面向?qū)ο蟮姆椒ㄩ_(kāi)發(fā)的軟件,其程序與問(wèn)題域是一致的,因此,在維護(hù)階段運(yùn)用面向?qū)ο蟮姆椒梢源蟠筇岣哕浖S護(hù)的效率。15在C++中也是先聲明一個(gè)類類型,然后用它去定義若干個(gè)同類型的對(duì)象。對(duì)象就是類類型的一個(gè)變量??梢哉f(shuō)類是對(duì)象的模板,是用來(lái)定義對(duì)象的一種抽象類型。在C++中對(duì)象的類型稱為類(class)。類代表了某一批對(duì)象的共性和特征。所以,每一個(gè)實(shí)體都是對(duì)象。有一些對(duì)象是具有相同的結(jié)構(gòu)和特性的,它們屬于一類。類和對(duì)象的關(guān)系:類是對(duì)象的抽象,不占用內(nèi)存,而對(duì)象是類的具體實(shí)例(instance),占用存儲(chǔ)空間。8.2類的聲明和對(duì)象的定義

8.2.1類和對(duì)象的關(guān)系16類是用戶自己定義的類型。如果程序中要用到類類型,必須自己根據(jù)需要進(jìn)行聲明,或者使用別人已設(shè)計(jì)好的類。

C++標(biāo)準(zhǔn)本身并不提供現(xiàn)成的類的名稱、結(jié)構(gòu)和內(nèi)容。classStudent//以class開(kāi)頭{ intnum; charname[20]; charsex;//以上3行是數(shù)據(jù)成員

voiddisplay()//這是成員函數(shù)

{cout<<″num:″<<num<<endl;

cout<<″name:″<<name<<endl;

cout<<″sex:″<<sex<<endl;//以上4行是函數(shù)中的操作語(yǔ)句

}};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象stud1和stud28.2.2聲明類類型17可以看到,類(class)就是對(duì)象的類型。實(shí)際上,類是一種廣義的數(shù)據(jù)類型。類這種數(shù)據(jù)類型中的數(shù)據(jù)既包含數(shù)據(jù),也包含操作數(shù)據(jù)的函數(shù)。不能把類中的全部成員與外界隔離,一般是把數(shù)據(jù)隱蔽起來(lái),而把成員函數(shù)作為對(duì)外界的接口??梢詫⑸厦骖惖穆暶鞲臑閏lassStudent//聲明類類型{private://聲明以下部分為私有的

intnum; charname[20]; charsex;public://聲明以下部分為公用的

voiddisplay() {cout<<″num:″<<num<<endl;

cout<<″name:″<<name<<endl;

cout<<″sex:″<<sex<<endl;}};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象18如果在類的定義中既不指定private,也不指定public,則系統(tǒng)就默認(rèn)為是私有的。歸納以上對(duì)類類型的聲明,可得到其一般形式如下:class類名//C++程序多數(shù)先寫public部分,這樣使用戶將 注意力集中在能被外界調(diào)用的成員上{private: <私有的數(shù)據(jù)和成員函數(shù)的說(shuō)明>;public: <公用的數(shù)據(jù)和成員函數(shù)的說(shuō)明>;};<各成員函數(shù)的實(shí)現(xiàn)>private和public稱為成員訪問(wèn)限定符(memberaccessspecifier)。還有一種成員訪問(wèn)限定符protected(受保護(hù)的),用protected聲明的成員稱為受保護(hù)的成員,它不能被類外訪問(wèn)(這點(diǎn)與私有成員類似),但可以被派生類的成員函數(shù)訪問(wèn)。19定義對(duì)象也可以有幾種方法:1.先聲明類類型,然后再定義對(duì)象classStudent//聲明類類型{private://聲明以下部分為私有的

intnum; charname[20]; charsex;public://聲明以下部分為公用的

voiddisplay() {cout<<″num:″<<num<<endl;

cout<<″name:″<<name<<endl;

cout<<″sex:″<<sex<<endl;}};Studentstud1,stud2;//定義了兩個(gè)Student類的對(duì)象8.2.3定義對(duì)象的方法202.在聲明類類型的同時(shí)定義對(duì)象classStudent//聲明類類型{public://先聲明公用部分

voiddisplay() {cout<<″num:″<<num<<endl;

cout<<″name:″<<name<<endl;

cout<<″sex:″<<sex<<endl;}private://后聲明私有部分

intnum; charname[20]; charsex;}stud1,stud2;//定義了兩個(gè)Student類的對(duì)象在定義Student類的同時(shí),定義了兩個(gè)Student類的對(duì)象。213.不出現(xiàn)類名,直接定義對(duì)象class//無(wú)類名{private://聲明以下部分為私有的┆

public://聲明以下部分為公用的┆}stud1,stud2;//定義了兩個(gè)無(wú)類名的類對(duì)象直接定義對(duì)象,在C++中是合法的、允許的,但卻很少用,也不提倡用。在實(shí)際的程序開(kāi)發(fā)中,一般都采用上面3種方法中的第1種方法。在小型程序中或所聲明的類只用于本程序時(shí),也可以用第2種方法。22類的成員函數(shù)(簡(jiǎn)稱類函數(shù))是函數(shù)的一種,它的用法和作用和函數(shù)基本上是一樣的,它也有返回值和函數(shù)類型。它與一般函數(shù)的區(qū)別只是:它是屬于一個(gè)類的成員,出現(xiàn)在類體中。它可以被指定為private(私有的)、public(公用的)或protected(受保護(hù)的)。在使用類函數(shù)時(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ì)23成員函數(shù)可以訪問(wèn)本類中任何成員(包括私有的和公用的),可以引用在本作用域中有效的數(shù)據(jù)。一般的做法是將需要被外界調(diào)用的成員函數(shù)指定為public,它們是類的對(duì)外接口。注意,并非要求把所有成員函數(shù)都指定為public。有的函數(shù)并不是準(zhǔn)備為外界調(diào)用的,而是為本類中的成員函數(shù)所調(diào)用的,就應(yīng)該將它們指定為private。這種函數(shù)的作用是支持其他函數(shù)的操作,是類中其他成員的工具函數(shù)(utilityfunction),類外用戶不能調(diào)用這些私有的工具函數(shù)。類的成員函數(shù)是類體中十分重要的部分。如果一個(gè)類中不包含成員函數(shù),就等同于C語(yǔ)言中的結(jié)構(gòu)體了,體現(xiàn)不出類在面向?qū)ο蟪绦蛟O(shè)計(jì)中的作用。24在前面已經(jīng)看到成員函數(shù)是在類體中定義的。也可以在類體中只寫成員函數(shù)的聲明,而在類的外面進(jìn)行函數(shù)定義。如:classStudent{public: voiddisplay();//公用成員函數(shù)原型聲明

private:

intnum; stringname; charsex;//以上3行是私有數(shù)據(jù)成員};voidStudent∷display()//在類外定義display類函數(shù){cout<<″num:″<<num<<endl;//函數(shù)體cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}Studentstud1,stud2;//定義兩個(gè)類對(duì)象注意:成員函數(shù)在類外定義時(shí),必須在函數(shù)名前面加上類名,予以限定(qualifed),“∷”是作用域運(yùn)算符,用它聲明函數(shù)是屬于哪個(gè)類的。8.3.2在類外定義成員函數(shù)25關(guān)于內(nèi)置(inline)函數(shù),已作過(guò)介紹。類的成員函數(shù)也可以指定為內(nèi)置函數(shù)。在類體中定義的成員函數(shù)的規(guī)模一般都很小,而系統(tǒng)調(diào)用函數(shù)的過(guò)程所花費(fèi)的時(shí)間開(kāi)銷相對(duì)是比較大的。調(diào)用一個(gè)函數(shù)的時(shí)間開(kāi)銷遠(yuǎn)遠(yuǎn)大于小規(guī)模函數(shù)體中全部語(yǔ)句的執(zhí)行時(shí)間。為了減少時(shí)間開(kāi)銷,如果在類體中定義的成員函數(shù)中不包括循環(huán)等控制結(jié)構(gòu),C++系統(tǒng)會(huì)自動(dòng)將它們作為內(nèi)置(inline)函數(shù)來(lái)處理。也就是說(shuō),在程序調(diào)用這些成員函數(shù)時(shí),并不是真正地執(zhí)行函數(shù)的調(diào)用過(guò)程(如保留返回地址等處理),而是把函數(shù)代碼嵌入程序的調(diào)用點(diǎn)。這樣可以大大減少調(diào)用成員函數(shù)的時(shí)間開(kāi)銷。8.3.3inline成員函數(shù)26C++要求對(duì)一般的內(nèi)置函數(shù)要用關(guān)鍵字inline聲明,但對(duì)類內(nèi)定義的成員函數(shù),可以省略inline,因?yàn)檫@些成員函數(shù)已被隱含地指定為內(nèi)置函數(shù)。如classStudent{public: voiddisplay() {cout<<″num:″<<num<<endl;

cout<<″name:″<<name<<endl;

cout<<″sex:″<<sex<<endl; }private:

intnum; stringname; charsex;};voiddisplay()也可以寫成inlinevoiddisplay()對(duì)在類體內(nèi)定義的函數(shù),一般都省寫inline。27如果成員函數(shù)不在類體內(nèi)定義,而在類體外定義,系統(tǒng)并不把它默認(rèn)為內(nèi)置(inline)函數(shù),如果想將這些成員函數(shù)指定為內(nèi)置函數(shù),應(yīng)當(dāng)用inline作顯式聲明。如classStudent{public: inlinevoiddisplay();//聲明此成員函數(shù)為內(nèi)置函數(shù)

private:

intnum; stringname; charsex;};inlinevoidStudent∷display()//在類外定義display函數(shù)為內(nèi)置函數(shù){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}

只有在類外定義的成員函數(shù)規(guī)模很小而調(diào)用頻率較高時(shí),才將此成員函數(shù)指定為內(nèi)置函數(shù)。28用類去定義對(duì)象時(shí),系統(tǒng)會(huì)為每一個(gè)對(duì)象分配存儲(chǔ)空間。如果一個(gè)類包括了數(shù)據(jù)和函數(shù),要分別為數(shù)據(jù)和函數(shù)的代碼分配存儲(chǔ)空間。按理說(shuō),如果用同一個(gè)類定義了10個(gè)對(duì)象,那么就需要分別為10個(gè)對(duì)象的數(shù)據(jù)和函數(shù)代碼分配存儲(chǔ)單元,如圖8.4所示。圖8.48.3.4成員函數(shù)的存儲(chǔ)方式29 能否只用一段空間來(lái)存放這個(gè)共同的函數(shù)代碼段,在調(diào)用各對(duì)象的函數(shù)時(shí),都去調(diào)用這個(gè)公用的函數(shù)代碼。如圖8.5所示。

圖8.5顯然,這樣做會(huì)大大節(jié)約存儲(chǔ)空間。C++編譯系統(tǒng)正是這樣做的,因此每個(gè)對(duì)象所占用的存儲(chǔ)空間只是該對(duì)象的數(shù)據(jù)部分所占用的存儲(chǔ)空間,而不包括函數(shù)代碼所占用的存儲(chǔ)空間。30如果聲明了一個(gè)類:classTime{public:

inthour;

intminute;

intsec; voidset() {cin>>a>>b>>c;}};可以用下面的語(yǔ)句來(lái)輸出該類對(duì)象所占用的字節(jié)數(shù):cout<<sizeof(Time)<<endl;輸出的值是12。這就證明了一個(gè)對(duì)象所占的空間大小只取決于該對(duì)象中數(shù)據(jù)成員所占的空間,而與成員函數(shù)無(wú)關(guān)。函數(shù)代碼是存儲(chǔ)在對(duì)象空間之外的。如果對(duì)同一個(gè)類定義了10個(gè)對(duì)象,這些對(duì)象的成員函數(shù)對(duì)應(yīng)的是同一個(gè)函數(shù)代碼段,而不是10個(gè)不同的函數(shù)代碼段。31例:8-1-(1).cpp#include"iostream"usingnamespacestd;classTime{public:

inthour;

intminute;

intsec; voidset();};voidTime::set() {cin>>hour>>minute>>sec;}intmain(){ Timet1,t2;

cout<<sizeof(Time)<<endl;

cout<<sizeof(t1)<<endl;

cout<<sizeof(t2)<<endl; return0;}32需要注意的是:雖然調(diào)用不同對(duì)象的成員函數(shù)時(shí)都是執(zhí)行同一段函數(shù)代碼,但是執(zhí)行結(jié)果一般是不相同的。

C++專門設(shè)立了一個(gè)名為this的指針,不同的對(duì)象使用的是同一個(gè)函數(shù)代碼段,該指針用來(lái)指向不同的對(duì)象。33在程序中經(jīng)常需要訪問(wèn)對(duì)象中的成員。訪問(wèn)對(duì)象中的成員可以有3種方法:通過(guò)對(duì)象名和成員運(yùn)算符訪問(wèn)對(duì)象中的成員;訪問(wèn)對(duì)象中成員的一般形式為對(duì)象名.成員名例如:stud1.num=1001;//假設(shè)num已定義為公用的整型數(shù)據(jù)成員

stud1.display();//正確,調(diào)用對(duì)象stud1的公用成員函數(shù)在類外只能調(diào)用公用的成員函數(shù)。在一個(gè)類中應(yīng)當(dāng)至少有一個(gè)公用的成員函數(shù),作為對(duì)外的接口,否則就無(wú)法對(duì)對(duì)象進(jìn)行任何操作。8.4對(duì)象成員的引用34通過(guò)指向?qū)ο蟮闹羔樤L問(wèn)對(duì)象中的成員;用指針訪問(wèn)對(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à)。通過(guò)對(duì)象的引用變量訪問(wèn)對(duì)象中的成員。如果已聲明了Time類,并有以下定義語(yǔ)句:Timet1;//定義對(duì)象t1Time&t2=t1;//定義Time類引用變量t2,并使之初始化為t1cout<<t2.hour;//輸出對(duì)象t1中的成員hour由于t2與t1共占同一段存儲(chǔ)單元(即t2是t1的別名),因此t2.hour就是t1.hour。35

C++通過(guò)類來(lái)實(shí)現(xiàn)封裝性,把數(shù)據(jù)和與這些數(shù)據(jù)有關(guān)的操作封裝在一個(gè)類中。公用成員函數(shù)是用戶使用類的公用接口,或者說(shuō)是類的對(duì)外接口。類中被操作的數(shù)據(jù)是私有的,實(shí)現(xiàn)的細(xì)節(jié)對(duì)用戶是隱蔽的,這種實(shí)現(xiàn)稱為私有實(shí)現(xiàn)(privateimplementation)。這種“類的公用接口與私有實(shí)現(xiàn)的分離”形成了信息隱蔽。軟件工程的一個(gè)最基本的原則就是將接口與實(shí)現(xiàn)分離,它的好處在于:(1)如果想修改或擴(kuò)充類的功能,只需修改本類中有關(guān)的數(shù)據(jù)成員和與它有關(guān)的成員函數(shù),程序中類外的部分可以不必修改。(2)如果在編譯時(shí)發(fā)現(xiàn)類中的數(shù)據(jù)讀寫有錯(cuò),不必檢查整個(gè)程序,只需檢查本類中訪問(wèn)這些數(shù)據(jù)的少數(shù)成員函數(shù)。8.5類的封裝性和信息隱蔽

8.5.1公用接口與私有實(shí)現(xiàn)的分離36在面向?qū)ο蟮某绦蜷_(kāi)發(fā)中,一般做法是將類的聲明(其中包含成員函數(shù)的聲明)放在指定的頭文件中,用戶如果想用該類,只要把有關(guān)的頭文件包含進(jìn)來(lái)即可,不必在程序中重復(fù)書寫類的聲明,以減少工作量,節(jié)省篇幅,提高編程的效率。由于在頭文件中包含了類的聲明,因此在程序中就可以用該類來(lái)定義對(duì)象。由于在類體中包含了對(duì)成員函數(shù)的聲明,在程序中就可以調(diào)用這些對(duì)象的公用成員函數(shù)。為了實(shí)現(xiàn)信息隱蔽,對(duì)類成員函數(shù)的定義一般不放在頭文件中,而另外放在一個(gè)文件中。8.5.2類聲明和成員函數(shù)定義的分離37例如,可以分別寫兩個(gè)文件://student.h(頭文件可以包括:外部變量聲明、函數(shù)原型聲明、類聲明、常量聲明、內(nèi)聯(lián)函數(shù)和typedef聲明,該頭文件則進(jìn)行類的聲明)classStudent//類聲明{public: voiddisplay();//公用成員函數(shù)原型聲明private:

intnum; charname[20]; charsex;};//student.cpp//在此文件中進(jìn)行函數(shù)的定義#include<iostream>#include“student.h”//不要漏寫此行,否則編譯通不過(guò)Usingnamespacestd;voidStudent∷display()//在類外定義display類函數(shù){cout<<″num:″<<num<<endl;

cout<<″name:″<<name<<endl;

cout<<″sex:″<<sex<<endl;}38為了組成一個(gè)完整的源程序,還應(yīng)當(dāng)有包括主函數(shù)的源文件://main.cpp

主函數(shù)模塊//#include<iostream>#include“student.h”//將類聲明頭文件包含進(jìn)來(lái)//Usingnamespacestd;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″行。39請(qǐng)注意:由于將頭文件student.h放在用戶當(dāng)前目錄中,因此在文件名兩側(cè)用雙撇號(hào)包起來(lái)(″student.h″)而不用尖括號(hào)(<student.h>),否則編譯時(shí)會(huì)找不到此文件。圖8.6。40由于要求接口與實(shí)現(xiàn)分離,為軟件開(kāi)發(fā)商向用戶提供類庫(kù)創(chuàng)造了很好的條件。開(kāi)發(fā)商把用戶所需的各種類的聲明按類放在不同的頭文件中,同時(shí)對(duì)包含成員函數(shù)定義的源文件進(jìn)行編譯,得到成員函數(shù)定義的目標(biāo)代碼。軟件商向用戶提供這些頭文件和類的實(shí)現(xiàn)的目標(biāo)代碼(不提供函數(shù)定義的源代碼)。用戶在使用類庫(kù)中的類時(shí),只需將有關(guān)頭文件包含到自己的程序中,并且在編譯后連接成員函數(shù)定義的目標(biāo)代碼即可。由于類庫(kù)的出現(xiàn),用戶可以像使用零件一樣方便地使用在實(shí)踐中積累的通用的或?qū)S玫念?,這就大大減少了程序設(shè)計(jì)的工作量,有效地提高了工作效率。41在面向?qū)ο蟪绦蚶碚撝?,“方法”是指?duì)數(shù)據(jù)的操作。一個(gè)“方法”對(duì)應(yīng)一種操作。顯然,只有被聲明為公用的方法(成員函數(shù))才能被對(duì)象外界所激活。外界是通過(guò)發(fā)“消息”來(lái)激活有關(guān)方法的。所謂“消息”,其實(shí)就是一個(gè)命令,由程序語(yǔ)句來(lái)實(shí)現(xiàn)。stud.display();就是向?qū)ο髎tud發(fā)出的一個(gè)“消息”,通知它執(zhí)行其中的display“方法”(即display函數(shù))。上面這個(gè)語(yǔ)句涉及3個(gè)術(shù)語(yǔ):對(duì)象、方法和消息。stud是對(duì)象,display()是方法,語(yǔ)句“stud.display();”是消息。8.5.3面向?qū)ο蟪绦蛟O(shè)計(jì)中的幾個(gè)名詞42例8.1最簡(jiǎn)單的例子。#include<iostream>usingnamespacestd;classTime//定義Time類{public://數(shù)據(jù)成員為公用的

inthour;

intminute;

intsec;};intmain(){Timet1;//定義t1為Time類對(duì)象

cin>>t1.hour;//輸入設(shè)定的時(shí)間

cin>>t1.minute;

cin>>t1.sec;

cout<<t1.hour<<″:″<<t1.minute<<″:″<<t1.sec<<endl;//輸出時(shí)間

return0;}//運(yùn)行情況如下:123243↙12:32:438.6類和對(duì)象的簡(jiǎn)單應(yīng)用舉例43例8.3將程序用含成員函數(shù)的類來(lái)處理。#include<iostream>usingnamespacestd;classTime{public: voidset_time();//公用成員函數(shù)

voidshow_time();//公用成員函數(shù)

private://數(shù)據(jù)成員為私有

inthour;

intminute;

intsec;};intmain(){ Timet1;//定義對(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ì)象t244

t2.set_time();//調(diào)用對(duì)象t2的成員函數(shù)set_time,向t

溫馨提示

  • 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)論