C++程序設(shè)計(jì) 大學(xué)基礎(chǔ)教程第八章_第1頁
C++程序設(shè)計(jì) 大學(xué)基礎(chǔ)教程第八章_第2頁
C++程序設(shè)計(jì) 大學(xué)基礎(chǔ)教程第八章_第3頁
C++程序設(shè)計(jì) 大學(xué)基礎(chǔ)教程第八章_第4頁
C++程序設(shè)計(jì) 大學(xué)基礎(chǔ)教程第八章_第5頁
已閱讀5頁,還剩49頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++大學(xué)基礎(chǔ)教程第8章類與對(duì)象

北京科技大學(xué)信息基礎(chǔ)科學(xué)系2023/12/221北京科技大學(xué)類是實(shí)現(xiàn)C++面向?qū)ο蟪绦蛟O(shè)計(jì)的基礎(chǔ)。面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)有:抽象、封裝、繼承和多態(tài),類把數(shù)據(jù)和函數(shù)封裝在一起,是C++封裝的基本單元。28.1類和對(duì)象的定義8.2對(duì)象的使用8.3構(gòu)造函數(shù)8.4析構(gòu)函數(shù)8.5拷貝構(gòu)造函數(shù)8.6類的靜態(tài)成員8.7類成員的保護(hù)和使用8.8類的組合(不要求)8.9面向?qū)ο蠓治龊驮O(shè)計(jì)(不要求)第8章類與對(duì)象3

8.1類和對(duì)象的定義

2023/12/224北京科技大學(xué)8.1類和對(duì)象的定義一個(gè)類表示現(xiàn)實(shí)生活中的一類事物,比如“學(xué)生”事物有相應(yīng)的特征或?qū)傩裕鼈兙褪穷惖臄?shù)據(jù)成員;事物可能有行為動(dòng)作,也可能被某些行為動(dòng)作所操作,這些都用函數(shù)來實(shí)現(xiàn),這些函數(shù)和類有著不可分割的關(guān)系,是構(gòu)成類的函數(shù)成員,或者叫成員函數(shù)。在C++中,類實(shí)際上相當(dāng)于一種用戶自定義的數(shù)據(jù)類型。

5對(duì)象是一類事物中的一個(gè)具體的個(gè)體。在定義了類類型后,就可以定義該類型的變量,這個(gè)變量就稱為類的對(duì)象(或?qū)嵗?。所以,從程序設(shè)計(jì)的角度來看,對(duì)象就相當(dāng)于變量。

8.1類和對(duì)象的定義6舉例:classStudent//類的定義{private:

intid; charname[20];

intage; floatscore;public: voidgetscore() voidprintstu()};

8.1類和對(duì)象的定義71、使用類對(duì)象如果已經(jīng)知道某個(gè)類的功能和接口函數(shù),就可以使用它了。先定義類對(duì)象,通過對(duì)象調(diào)用接口函數(shù)實(shí)現(xiàn)一定的功能。

classstudentstu01;//class也可以省略不寫stu01.getscore();stu01.printstu();

這個(gè)過程的本質(zhì)是:根據(jù)對(duì)象所需要完成的任務(wù),向?qū)ο蟀l(fā)送消息。對(duì)象收到消息后,調(diào)用接口中的相應(yīng)的函數(shù),完成它的功能。對(duì)象只需要知道“做什么”,具體工作由成員函數(shù)來完成。

82、類的聲明類的聲明具體說明類的組成,聲明類的語法形式為: class類名稱 {public:

公有成員 protect:

保護(hù)型成員 private:

私有成員 };9其中,“成員”既可以是數(shù)據(jù)成員,也可以是成員函數(shù)的原型。數(shù)據(jù)成員的聲明方式與一般變量相同。函數(shù)成員是描述類的對(duì)象可以進(jìn)行的操作,一般在類中聲明原型,在類聲明的外面定義函數(shù)的具體實(shí)現(xiàn)。2、類的聲明102、類的聲明關(guān)鍵字public、protect、private說明類成員的訪問控制屬性。私有(private)成員只允許本類的成員函數(shù)來訪問;公有(public)成員是類對(duì)外的接口,在類聲明和類(函數(shù))實(shí)現(xiàn)之后,類的對(duì)象可以訪問公有成員。保護(hù)型(protected)成員的可訪問性和私有成員的性質(zhì)相似。11關(guān)于訪問控制屬性,注意:在類聲明中,三種訪問控制屬性,可以按任意次序出現(xiàn),也可以不出現(xiàn)。public等關(guān)鍵字也可以多次出現(xiàn),但是一個(gè)成員只能具有一種訪問控制屬性。如果不寫訪問控制屬性關(guān)鍵字,默認(rèn)的是private。在書寫時(shí)通常習(xí)慣將公有類型放在最前面,這樣便于閱讀,因?yàn)樗鼈兪峭獠吭L問時(shí)所要了解的。一般情況下,一個(gè)類的數(shù)據(jù)成員應(yīng)該聲明為私有成員,這樣封裝性較好。一個(gè)類應(yīng)該有一些公有的函數(shù)成員,作為對(duì)外的接口,否則別的代碼無法訪問類

2、類的聲明12類的成員函數(shù)描述的是類的行為或操作。函數(shù)的原型聲明要在類的主體中,原型說明了函數(shù)的參數(shù)表和返回值類型。而函數(shù)的具體實(shí)現(xiàn)一般是寫在類聲明之外的。在類的外部定義成員函數(shù)的語法形式為:

返回值類型類名::成員函數(shù)名(參數(shù)表){

函數(shù)體}3、類的成員函數(shù)13如果在類的內(nèi)部定義成員函數(shù)的具體實(shí)現(xiàn),則該成員函數(shù)為內(nèi)聯(lián)成員函數(shù)。函數(shù)定義時(shí)沒有任何的附加說明,所以稱為隱式聲明的內(nèi)聯(lián)成員。

3、類的成員函數(shù)14定義一個(gè)對(duì)象和定義一個(gè)一般變量相同。定義變量時(shí)要分配存儲(chǔ)空間,同樣,定義一個(gè)對(duì)象時(shí)要分配存儲(chǔ)空間,一個(gè)對(duì)象所占的內(nèi)存空間是類的數(shù)據(jù)成員所占的空間總和。類的成員函數(shù)存放在代碼區(qū),不占內(nèi)存空間。類的成員是抽象的,對(duì)象的成員才是具體的。類的數(shù)據(jù)成員都不會(huì)有具體的屬性值。只有對(duì)象的成員才會(huì)有具體的屬性值。4、對(duì)象15聲明了類及其對(duì)象,在類的外部(指類定義和成員函數(shù)的實(shí)現(xiàn)代碼之外),就可以訪問對(duì)象的公有成員(包括數(shù)據(jù)成員和函數(shù)成員)了。

在類的外部,只能通過對(duì)象訪問類的公有成員;在類的成員函數(shù)內(nèi)部,可以直接訪問類的所有成員,這就實(shí)現(xiàn)了對(duì)訪問范圍的有效控制。

4、對(duì)象16類作用域是指類定義和相應(yīng)的成員函數(shù)定義的范圍,通俗地稱為類的內(nèi)部。C++認(rèn)為一個(gè)類的全部成員都是一個(gè)整體的相關(guān)部分。一個(gè)類的所有成員位于這個(gè)類的作用域內(nèi),在該范圍內(nèi),一個(gè)類的成員函數(shù)對(duì)本類的其它成員具有無限制的訪問權(quán)。

5、類的作用域與可見性17

8.2對(duì)象的使用

2023/12/2218北京科技大學(xué)8.2對(duì)象的使用對(duì)象是類的一個(gè)具體的實(shí)例,類和對(duì)象的關(guān)系相當(dāng)于普遍與特殊的關(guān)系。在C++中,類是一個(gè)自定義的數(shù)據(jù)類型,對(duì)象是該數(shù)據(jù)類型的一個(gè)變量。所以,可以定義一個(gè)全局的對(duì)象,也可以在函數(shù)體中定義一個(gè)局部的對(duì)象,或者動(dòng)態(tài)地從堆中申請(qǐng)空間來創(chuàng)建一個(gè)對(duì)象,還可以定義對(duì)象數(shù)組,以及使用對(duì)象作為函數(shù)的參數(shù)與返回值。

191、對(duì)象指針聲明對(duì)象指針的一般語法形式為:類名*對(duì)象指針名;使用對(duì)象指針訪問對(duì)象的成員,語法形式為:對(duì)象指針名->公有成員;例如:Clockc; //在棧中分配Clock型存儲(chǔ)空間Clock*pc1=newClock;//在堆中分配Clock型存儲(chǔ)空間Clock*pc2=&c;

pc1->SetTime(12,5,0);202、

this指針問:一個(gè)類中所有對(duì)象調(diào)用的成員函數(shù)都執(zhí)行同一段代碼。那么,成員函數(shù)又是怎么識(shí)別當(dāng)前是那個(gè)對(duì)象在訪問呢?

答:this指針指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對(duì)象。不同的對(duì)象調(diào)用成員函數(shù)時(shí),this指針將指向不同的對(duì)象,也就可以訪問不同對(duì)象的數(shù)據(jù)成員。

213、對(duì)象數(shù)組對(duì)象數(shù)組的元素是對(duì)象,不僅具有數(shù)據(jù)成員,而且還有函數(shù)成員,可以通過數(shù)組元素調(diào)用成員函數(shù)。

224、對(duì)象用做函數(shù)的參數(shù)和返回值可以將對(duì)象作為參數(shù)傳遞給一個(gè)函數(shù)或從函數(shù)返回一個(gè)對(duì)象。直接用對(duì)象作為參數(shù),調(diào)用函數(shù)時(shí),進(jìn)行值傳遞,實(shí)參的值要復(fù)制給形參,如果類的數(shù)據(jù)成員較多時(shí),需要一一復(fù)制,這種參數(shù)傳遞方式效率不高,可以使用對(duì)象指針或?qū)ο笠梅绞絹韨鬟f函數(shù)參數(shù)。23

8.3構(gòu)造函數(shù)

2023/12/2224北京科技大學(xué)8.3構(gòu)造函數(shù)每個(gè)對(duì)象區(qū)別于其他對(duì)象的地方主要有兩個(gè),外在的區(qū)別就是對(duì)象的標(biāo)識(shí)符,即對(duì)象的名稱,而內(nèi)在的區(qū)別就是對(duì)象自身的屬性值,即數(shù)據(jù)成員的值。在定義一個(gè)對(duì)象的時(shí)候要給它分配存儲(chǔ)空間,也可以同時(shí)給它的數(shù)據(jù)成員賦初值,稱為對(duì)象的初始化。C++程序中的對(duì)象初始化工作由一個(gè)特殊的成員函數(shù)來完成,就是構(gòu)造函數(shù)。因?yàn)椴煌愋偷膶?duì)象的初始化工作是不一樣的,因此構(gòu)造函數(shù)從屬于某個(gè)類的,即每個(gè)類都要定義它自己的構(gòu)造函數(shù),它是類的成員函數(shù)。

25定義構(gòu)造函數(shù)的一般形式為:class類名{public:

類名(形參表); //構(gòu)造函數(shù)的原型 //類的其它成員};類名::類名(形參表) //構(gòu)造函數(shù)的實(shí)現(xiàn){ //函數(shù)體}

8.3構(gòu)造函數(shù)26構(gòu)造函數(shù)的特點(diǎn)是:構(gòu)造函數(shù)的函數(shù)名與類名相同;而且沒有返回值。構(gòu)造函數(shù)一定是公有函數(shù)。作為類的成員函數(shù),構(gòu)造函數(shù)可以直接訪問類的所有數(shù)據(jù)成員。在類的內(nèi)部定義的構(gòu)造函數(shù)是內(nèi)聯(lián)函數(shù)。構(gòu)造函數(shù)可以帶默認(rèn)形參值,也可以重載。

8.3構(gòu)造函數(shù)27在聲明類是如果沒有定義類的構(gòu)造函數(shù),編譯系統(tǒng)就會(huì)在編譯時(shí)自動(dòng)生成一個(gè)默認(rèn)形式的構(gòu)造函數(shù),默認(rèn)構(gòu)造函數(shù)是構(gòu)造對(duì)象時(shí)不提供參數(shù)的構(gòu)造函數(shù)。除了無參數(shù)構(gòu)造函數(shù)是默認(rèn)構(gòu)造函數(shù)外,帶有全部默認(rèn)參數(shù)值的構(gòu)造函數(shù)也是默認(rèn)構(gòu)造函數(shù)。8.3構(gòu)造函數(shù)28

8.4析構(gòu)函數(shù)

2023/12/2229北京科技大學(xué)與構(gòu)造函數(shù)相反,當(dāng)對(duì)象生存期結(jié)束時(shí),需要調(diào)用析構(gòu)函數(shù),釋放對(duì)象所占的內(nèi)存空間。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的一個(gè)公有成員函數(shù),它的名稱是在類名前加“~”構(gòu)成,沒有返回值,和構(gòu)造函數(shù)不同的是析構(gòu)函數(shù)不接受任何參數(shù)。析構(gòu)函數(shù)是在對(duì)象生存期即將結(jié)束的時(shí)刻由系統(tǒng)自動(dòng)調(diào)用的。如果程序員沒有定義析構(gòu)函數(shù),系統(tǒng)將自動(dòng)生成和調(diào)用一個(gè)默認(rèn)析構(gòu)函數(shù)。類的析構(gòu)函數(shù)不能重載。8.4析構(gòu)函數(shù)30

8.5拷貝構(gòu)造函數(shù)

2023/12/2231北京科技大學(xué)拷貝構(gòu)造函數(shù)就是函數(shù)的形參是類的對(duì)象的引用的構(gòu)造函數(shù)。通過等于號(hào)復(fù)制對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。如果程序在類定義時(shí)沒有顯式定義拷貝構(gòu)造函數(shù),系統(tǒng)也會(huì)自動(dòng)生成一個(gè)默認(rèn)的拷貝構(gòu)造函數(shù),把成員值一一復(fù)制。拷貝構(gòu)造函數(shù)與原來的構(gòu)造函數(shù)實(shí)現(xiàn)了函數(shù)的重載。8.5拷貝構(gòu)造函數(shù)32完成簡(jiǎn)單的一一對(duì)應(yīng)的復(fù)制的拷貝構(gòu)造函數(shù)稱為淺拷貝。如果類的數(shù)據(jù)成員包括指針變量,類的構(gòu)造函數(shù)用new運(yùn)算符為這個(gè)指針動(dòng)態(tài)申請(qǐng)空間。如果通過淺拷貝進(jìn)行了對(duì)象的復(fù)制。最后,在退出運(yùn)行時(shí),程序會(huì)報(bào)錯(cuò)。這時(shí)需要用“深拷貝”的方式恰當(dāng)定義類的拷貝構(gòu)造函數(shù)。一般來講,如果一個(gè)類需要析構(gòu)函數(shù)來釋放資源,則它也需要定義一個(gè)顯式拷貝構(gòu)造函數(shù)來實(shí)現(xiàn)深拷貝。

淺拷貝與深拷貝33以下三種情況系統(tǒng)會(huì)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù):當(dāng)用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí)如果函數(shù)的形參是類的對(duì)象,調(diào)用函數(shù)時(shí),進(jìn)行形參和實(shí)參結(jié)合時(shí)如果函數(shù)的返回值是類的對(duì)象,函數(shù)執(zhí)行完成返回調(diào)用者時(shí)8.5拷貝構(gòu)造函數(shù)34

8.6類的靜態(tài)成員

2023/12/2235北京科技大學(xué)1、靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員是類的數(shù)據(jù)成員的一種特例,采用static關(guān)鍵字來聲明。類的數(shù)據(jù)成員在類的每一個(gè)對(duì)象中分別存儲(chǔ)不同的數(shù)值,但是靜態(tài)數(shù)據(jù)成員則不同,它在整個(gè)類中只有一個(gè)拷貝,由該類的所有對(duì)象共同維護(hù)和使用,從而實(shí)現(xiàn)了同一類的不同對(duì)象之間的數(shù)據(jù)共享。靜態(tài)數(shù)據(jù)成員具有靜態(tài)生存期。在類的聲明中只能聲明靜態(tài)數(shù)據(jù)成員的存在。由于類的聲明是抽象的,靜態(tài)數(shù)據(jù)成員的初始化需要在類的外部進(jìn)行,通過類名對(duì)它進(jìn)行訪問。362、靜態(tài)成員函數(shù)可以通過定義和使用靜態(tài)成員函數(shù)來訪問靜態(tài)數(shù)據(jù)成員。所謂靜態(tài)成員函數(shù)就是使用static關(guān)鍵字聲明函數(shù)成員。同靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)也屬整個(gè)類,由同一個(gè)類的所有對(duì)象共同維護(hù),為這些對(duì)象所共享。372、靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)作為成員函數(shù),它的訪問屬性可以受到類的嚴(yán)格控制。對(duì)公有靜態(tài)成員函數(shù),可以通過類名或?qū)ο竺麃碚{(diào)用;而一般的非靜態(tài)公有成員函數(shù)只能通過對(duì)象名來調(diào)用。靜態(tài)成員函數(shù)可以直接訪問該類的靜態(tài)數(shù)據(jù)成員和函數(shù)成員;而訪問非靜態(tài)數(shù)據(jù)成員,必須通過參數(shù)傳遞方式得到對(duì)象名,然后通過對(duì)象名來訪問。38

8.7類成員的保護(hù)和使用

2023/12/2239北京科技大學(xué)1、類的封裝在程序設(shè)計(jì)中,將數(shù)據(jù)與操作數(shù)據(jù)的行為進(jìn)行有機(jī)地結(jié)合,這就是封裝。C++語言提供類這種語言成分來實(shí)現(xiàn)封裝,類是屬性和操作的結(jié)合體,并且在定義類的屬性和操作時(shí),規(guī)定了它們的可見性。通過封裝將一部分成員作為類與外部的接口,而將其它的成員隱藏起來,以防外界的干擾和誤操作,使程序的不同模塊之間的相互影響減小到最低限度。402、友元在一個(gè)類中,可以利用關(guān)鍵字friend將別的模塊(一般函數(shù)、其它類的成員函數(shù)或其它類)聲明為本類的友元,這樣類中本來隱藏的信息(私有和保護(hù)成員)就可以被友元訪問。友元提供了不同類或?qū)ο蟮某蓡T函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制。友元并不是類的成員。412、友元關(guān)于友元類,要注意:友元關(guān)系是不能傳遞的。B類是A類的友元,C類是B類的友元,C類和A類之間,如果沒有聲明,就沒有任何友元關(guān)系,不能進(jìn)行數(shù)據(jù)共享。友元關(guān)系是單向的。如果聲明B類是A類的友元,B類的成員函數(shù)就可以訪問A類的私有和保護(hù)數(shù)據(jù),但A類的成員函數(shù)卻不能訪問B類的私有和保護(hù)數(shù)據(jù)。423、常對(duì)象和常成員定義對(duì)象時(shí)用const進(jìn)行修飾,稱為常對(duì)象,它的數(shù)據(jù)成員值在對(duì)象的整個(gè)生存期間內(nèi)不能被改變。也就是說,常對(duì)象在定義時(shí)必須進(jìn)行初始化,而且不能被更新。使用常量,既實(shí)現(xiàn)了數(shù)據(jù)共享、又可以保證數(shù)據(jù)不會(huì)被改變。433、常對(duì)象和常成員對(duì)于類的某個(gè)成員函數(shù),使用const關(guān)鍵字修飾,稱為常成員函數(shù)。常對(duì)象只能調(diào)用常成員函數(shù),保證常對(duì)象的數(shù)據(jù)成員不能被修改。使用const說明的數(shù)據(jù)成員稱為常數(shù)據(jù)成員。如果在一個(gè)類中說明了常數(shù)據(jù)成員,那么任何函數(shù)中都不能對(duì)該成員賦值。構(gòu)造函數(shù)對(duì)該數(shù)據(jù)成員進(jìn)行初始化,就只能通過初始化列表。443、常對(duì)象和常成員常成員函數(shù)的特點(diǎn):const是函數(shù)類型的一個(gè)組成部分,在函數(shù)實(shí)現(xiàn)時(shí)也要帶const關(guān)鍵字。常成員函數(shù)不能更新對(duì)象的數(shù)據(jù)成員,也不能調(diào)用該類中的非常成員函數(shù)。常對(duì)象只能調(diào)用常成員函數(shù),但是常成員函數(shù)也可以被普通對(duì)象來調(diào)用。const關(guān)鍵字可以被用于參與對(duì)重載函數(shù)的區(qū)分。45

8.8類的組合

2023/12/2246北京科技大學(xué)8.8類的組合類的組合(也稱類的聚集),描述的就是一個(gè)類內(nèi)嵌其它類的對(duì)象作為數(shù)據(jù)成員的情況,它們之間的關(guān)系是一種包含與被包含的關(guān)系。在面向?qū)ο蟪绦蛟O(shè)計(jì)中,可以對(duì)復(fù)雜對(duì)象進(jìn)行分解、抽象,把一個(gè)復(fù)雜對(duì)象分解為簡(jiǎn)單對(duì)象的組合。

47當(dāng)創(chuàng)建組合類的對(duì)象時(shí),各個(gè)內(nèi)嵌對(duì)象也將被自動(dòng)創(chuàng)建。因此,在創(chuàng)建組合類對(duì)象時(shí)既要對(duì)本類的基本數(shù)據(jù)成員進(jìn)行初始化,又要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初始化。在聲明一個(gè)組合類的對(duì)象時(shí),不僅它自身的構(gòu)造函數(shù)將被調(diào)用,而且還將調(diào)用其內(nèi)嵌對(duì)象的構(gòu)造函數(shù)。8.8類的組合48組合類構(gòu)造函數(shù)定義的一般形式為:類名

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論