




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
類和對(duì)象本章要點(diǎn):封裝與數(shù)據(jù)隱藏的軟件工程概念面向?qū)ο蟮某绦蛟O(shè)計(jì)思想及特點(diǎn)類的定義數(shù)據(jù)成員和成員函數(shù)的訪問控制權(quán)限構(gòu)造函數(shù)和析構(gòu)函數(shù)類的組合類模板的使用4.1面向?qū)ο蟮乃枷?.1.1結(jié)構(gòu)化程序設(shè)計(jì)面向過程的結(jié)構(gòu)化程序設(shè)計(jì)誕生于20世紀(jì)60年代,發(fā)展到20世紀(jì)80年代,已經(jīng)成為當(dāng)時(shí)程序設(shè)計(jì)的主流方法。它的基本思路是:自頂向下、逐步求精;其程序結(jié)構(gòu)是按功能劃分為若干個(gè)基本模塊,這些模塊形成一個(gè)樹狀結(jié)構(gòu);各模塊之間的關(guān)系盡可能簡(jiǎn)單,在功能上相對(duì)獨(dú)立;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成;其模塊化實(shí)現(xiàn)的具體方法是使用子程序。面向過程的結(jié)構(gòu)化程序設(shè)計(jì)方法將解決問題的重點(diǎn)放在如何實(shí)現(xiàn)過程的細(xì)節(jié)方面,把數(shù)據(jù)和對(duì)數(shù)據(jù)進(jìn)行操作的函數(shù)(過程)截然分開,以數(shù)據(jù)結(jié)構(gòu)為核心,圍繞著功能實(shí)現(xiàn)或操作流程來進(jìn)行程序設(shè)計(jì)。這樣設(shè)計(jì)出來的程序,其基本形式是主模塊與若干子模塊的組合。結(jié)構(gòu)化程序設(shè)計(jì)把數(shù)據(jù)和操作分離,一旦數(shù)據(jù)的格式或結(jié)構(gòu)發(fā)生改變,相應(yīng)的操作函數(shù)就需要改寫,而且往往不能對(duì)數(shù)據(jù)的安全性進(jìn)行有效的控制。如果要對(duì)程序進(jìn)行擴(kuò)充或升級(jí)改進(jìn),就需要大量的修改函數(shù)。4.1.2面向?qū)ο蟪绦蛟O(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)方法是對(duì)結(jié)構(gòu)化程序設(shè)計(jì)方法的繼承和發(fā)展。面向?qū)ο蟪绦蛟O(shè)計(jì)方法認(rèn)為:現(xiàn)實(shí)世界是由一系列彼此相關(guān)并且能夠相互通信的實(shí)體組成,這些實(shí)體就是面向?qū)ο蠓椒ㄖ械膶?duì)象,而一些對(duì)象的共性的抽象描述,就是面向?qū)ο蠓椒ㄖ械暮诵摹悺C嫦驅(qū)ο蟮某绦蛟O(shè)計(jì)方法就是運(yùn)用面向?qū)ο蟮挠^點(diǎn)來描述現(xiàn)實(shí)問題,然后用計(jì)算機(jī)語言來描述并處理該問題。這種描述和處理是通過類與對(duì)象實(shí)現(xiàn)的,是對(duì)現(xiàn)實(shí)問題的高度概括、分類和抽象。每個(gè)對(duì)象都具有自己的屬性和行為,整個(gè)程序是由一系列相互作用的對(duì)象構(gòu)成的,對(duì)象之間的交互通過發(fā)送消息來實(shí)現(xiàn)。用面向?qū)ο蟮挠^點(diǎn)和方法設(shè)計(jì)程序,屬性和行為被很好地封裝在對(duì)象中,對(duì)數(shù)據(jù)的訪問權(quán)限可以得到有效的控制。對(duì)象向外界提供必要的外部接口,而將實(shí)現(xiàn)細(xì)節(jié)隱藏起來。面向?qū)ο蟪绦蛟O(shè)計(jì)不僅實(shí)現(xiàn)了數(shù)據(jù)抽象,而且通過抽象出相關(guān)類的共性,而形成一般類(基類),并在此基礎(chǔ)上,采用繼承的方式,對(duì)一般類增添不同的特性而派生出多種特殊類(派生類)。面向?qū)ο蟪绦蛟O(shè)計(jì)支持多態(tài)性。多態(tài)性與繼承性相結(jié)合,使不同結(jié)構(gòu)的對(duì)象可以以各自不同的方式響應(yīng)同一消息。4.2面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)4.2.1抽象性在面向?qū)ο蠓椒ㄖ?,抽象是通過對(duì)一個(gè)系統(tǒng)進(jìn)行分析和認(rèn)識(shí),強(qiáng)調(diào)系統(tǒng)中某些本質(zhì)的特征,而對(duì)系統(tǒng)進(jìn)行的簡(jiǎn)化描述。一般,對(duì)問題的抽象包括兩個(gè)方面:數(shù)據(jù)抽象和行為抽象。數(shù)據(jù)抽象為程序員提供了對(duì)對(duì)象屬性和狀態(tài)的描述,行為抽象則是對(duì)這些數(shù)據(jù)所需要的操作的抽象。抽象的過程是通過模塊化來實(shí)現(xiàn)的。例如:我們需要在計(jì)算機(jī)上實(shí)現(xiàn)一個(gè)繪制圓形的程序。分析:可以看出需要三個(gè)數(shù)據(jù)來描述該圓的位置和大小,即圓心的橫、縱坐標(biāo)以及圓的半徑,這就是該圓形的數(shù)據(jù)抽象。另外,該圖形應(yīng)該具有設(shè)置圓心坐標(biāo)、設(shè)置半徑大小、繪制圓形等功能,這就是對(duì)它的行為抽象。用C++語言可以將該圖形描述如下:圓形(circle):數(shù)據(jù)抽象:doublex,y,r;行為抽象:setx();sety();setr();draw();抽象是面向?qū)ο蠓椒ǖ暮诵摹?.2.2封裝性在面向?qū)ο蠓椒ㄖ?,把某些相關(guān)的代碼和數(shù)據(jù)結(jié)合在一起,形成一個(gè)數(shù)據(jù)和操作的封裝體,這個(gè)封裝體向外提供一個(gè)可以控制的接口,其內(nèi)部大部分的實(shí)現(xiàn)細(xì)節(jié)則對(duì)外隱藏,從而達(dá)到對(duì)數(shù)據(jù)訪問權(quán)限的合理控制。封裝可以使得程序中各部分之間的相互影響達(dá)到最小,并且提高程序的安全性,簡(jiǎn)化代碼的編寫。對(duì)象是面向?qū)ο蟪绦蛘Z言支持并實(shí)現(xiàn)封裝的機(jī)制。對(duì)象中既包含數(shù)據(jù)(即屬性),又包含操作(即行為),它們都稱為對(duì)象的成員。通過對(duì)象成員的訪問控制屬性(公有屬性和私有屬性)可以實(shí)現(xiàn)數(shù)據(jù)和行為的封裝和隱藏。4.2.3繼承性繼承是軟件復(fù)用的一種方式,通過繼承,一個(gè)對(duì)象可以獲得另一個(gè)對(duì)象的屬性和行為,并加入屬于自己的一些特性和方法。繼承提供了創(chuàng)建新類的一種方法。繼承是很重要的概念。繼承支持多層分類的概念,使得一個(gè)個(gè)原來彼此孤立的類有效地組織起來,形成層次結(jié)構(gòu)關(guān)系。4.2.4多態(tài)性多態(tài)性就是一個(gè)接口,多種方式。在基類中定義的屬性和操作被派生類繼承后,可能具有不同的數(shù)據(jù)類型或表現(xiàn)出不同的行為。即多態(tài)性表現(xiàn)為同一屬性或操作在一般類及各特殊類中具有不同的語義。很顯然,實(shí)現(xiàn)多態(tài)性的好處在于:為這類對(duì)象提供服務(wù)時(shí),不必區(qū)分具體是哪種對(duì)象,只需發(fā)送相同的消息即可,而由各個(gè)對(duì)象去以適合自身的方式進(jìn)行不同的響應(yīng)。4.3面向?qū)ο蟮姆椒▽?duì)象的概念:對(duì)象在現(xiàn)實(shí)世界中是一個(gè)實(shí)體或者一種事物?,F(xiàn)實(shí)世界中的任何一個(gè)系統(tǒng)都是由若干個(gè)具體的對(duì)象構(gòu)成。作為系統(tǒng)的一個(gè)組成部分,對(duì)象為其所在的系統(tǒng)提供一定的功能,擔(dān)當(dāng)一定的角色。所以,對(duì)象可以看作是一種具有自身屬性和功能的構(gòu)件。對(duì)象的使用:不關(guān)心其內(nèi)部結(jié)構(gòu)及實(shí)現(xiàn)方法,只關(guān)心它的功能和它在系統(tǒng)中的使用方法,也就是該對(duì)象提供給用戶的接口。在面向?qū)ο蠓椒ㄖ?,將?duì)象定義為一組數(shù)據(jù)及其相關(guān)代碼的結(jié)合體,其中數(shù)據(jù)描述了對(duì)象的屬性,對(duì)數(shù)據(jù)進(jìn)行處理的操作則描述了對(duì)象的功能,而軟件系統(tǒng)由多個(gè)這樣的對(duì)象構(gòu)成。對(duì)象將其屬性和操作的一部分對(duì)外界開放,作為它的對(duì)外接口,而將大部分的實(shí)現(xiàn)細(xì)節(jié)隱藏,這就是對(duì)象的封裝性。面向?qū)ο蟮姆椒ㄖ蓄惖母拍睿壕褪峭瑯宇愋蛯?duì)象的抽象描述。對(duì)象是類的實(shí)例。類是面向?qū)ο蠓椒ǖ暮诵摹?duì)相關(guān)的類進(jìn)行分析,抽取這些類的共同特性,形成基類的概念。通過繼承,派生類可以包含基類的所有屬性和操作,還可以增加屬于自己的一些特性。通過繼承,可以將原來一個(gè)個(gè)孤立的類聯(lián)系起來,形成清晰的層次結(jié)構(gòu)關(guān)系,稱為類簇。一個(gè)系統(tǒng)由多個(gè)對(duì)象組成。其中復(fù)雜對(duì)象可以由簡(jiǎn)單對(duì)象組合而成,稱之為聚合。綜上所述,面向?qū)ο蟮姆椒ň褪抢贸橄?、封裝等機(jī)制,借助于對(duì)象、類、繼承、消息傳遞等概念進(jìn)行軟件系統(tǒng)構(gòu)造的軟件開發(fā)方法。4.4面向?qū)ο蟮臉?biāo)記可以用圖形把面向?qū)ο蟪绦蛟O(shè)計(jì)對(duì)問題的描述直觀地表示出來,設(shè)計(jì)人員,程序開發(fā)人員、用戶都可以通過它進(jìn)行方便的交流。面向?qū)ο髽?biāo)記圖應(yīng)該準(zhǔn)確清楚地描述以下四個(gè)問題:=1\*GB3①類,包括成員函數(shù)和成員數(shù)據(jù)(或方法);=2\*GB3②對(duì)象,類的實(shí)例;=3\*GB3③類及對(duì)象的關(guān)系,繼承或包含(組合);=4\*GB3④類及對(duì)象之間的聯(lián)系,相互作用與消息傳送等。面向?qū)ο蟮臉?biāo)記方法有很多種,其中UML(UnifiedModelingLanguage,統(tǒng)一建模語言)是目前國(guó)際上確定的標(biāo)準(zhǔn)標(biāo)記方法。它是一種比較完整的支持可視化建模的工具。這里我們介紹一種比較簡(jiǎn)單直觀的標(biāo)記方法——Cord/Yourdon標(biāo)記。Cord/Yourdon標(biāo)記分為兩類圖形符號(hào):表示符號(hào)和連接符號(hào)。表示符號(hào)用來表示類和對(duì)象。Cord/Yourdon標(biāo)記中用一個(gè)圓角矩形表示類,矩形內(nèi)部上下分為三個(gè)部分,上部是類名,中部表示該類的數(shù)據(jù)成員,下部表示該類的函數(shù)成員,圖4-1給出了一般類的標(biāo)記方法和一個(gè)point類的標(biāo)記實(shí)例。類名數(shù)據(jù)成員函數(shù)成員類名數(shù)據(jù)成員函數(shù)成員P1intX,Y;point(int,int);point(point);intGetX();intGetY();圖4-1類的標(biāo)記圖在Cord/Yourdong標(biāo)記中,對(duì)象是在相應(yīng)類標(biāo)記外加一個(gè)帶有圓角矩形框。如圖4-2所示,P1是Point類的一個(gè)對(duì)象,表示屏幕上一個(gè)點(diǎn)。P1intX,Y;Point(int,int);Point(Point);intGetX()P1intX,Y;Point(int,int);Point(Point);intGetX();intGetY();對(duì)象名數(shù)據(jù)成員函數(shù)成員4-2對(duì)象的標(biāo)記圖連接符號(hào)主要有三種,它們分別表示消息聯(lián)系、包含關(guān)系和繼承關(guān)系,如圖4-3所示。AAAB類繼承A類A包含BA給B發(fā)送消息B類繼承A類A包含BA給B發(fā)送消息BBB圖4-3面向?qū)ο筮B接符號(hào)圖4-4是用Cord/Yourdon標(biāo)記描述的關(guān)系圖,描述了兩個(gè)類———distance類與point類之間的關(guān)系。distancedistancepointp1,p2;doubledist;doublegetdis();P2intX,YP2intX,Y;point(int,int);point(Point&);intGetX();intGetY();P1intX,Y;point(int,int);point(point&);intGetX();intGetX();圖4-4Distance類和point類的關(guān)系圖4.5類和對(duì)象類是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。類實(shí)際上相當(dāng)于一種特殊的用戶自定義的數(shù)據(jù)類型,但它和一般的數(shù)據(jù)類型有著不同之處:類中不僅包含數(shù)據(jù),還包含函數(shù)??梢月暶黝愵愋偷淖兞?---稱為類的實(shí)例化(即對(duì)象)。4.5.1類的聲明類的聲明語法形式如下:class<類名>{private:私有成員protected:保護(hù)成員public:公有成員(外部接口)};其中,class是聲明類的關(guān)鍵字;<類名>是標(biāo)識(shí)符,表示聲明的類的名字;類聲明體內(nèi)的函數(shù)和變量分別表示類的成員函數(shù)和數(shù)據(jù)成員;private、protected和public關(guān)鍵字表示類成員的訪問控制屬性。類的成員函數(shù)用于對(duì)數(shù)據(jù)成員處理,又稱為“方法”。一般在類的聲明體中說明成員函數(shù)原型,而把其實(shí)現(xiàn)放在類外定義。【例4-1】類的聲明例題。//聲明一個(gè)類來表示時(shí)鐘classClock{private:inthour,minute,second;public:voidSetTime(intnewh,intnewm,intnews);voidShowTime();};4.5.2類成員的訪問控制C++中通過設(shè)置類成員的訪問控制屬性來控制各個(gè)成員的訪問權(quán)限。C++規(guī)定了三種訪問控制屬性:public(公有)、private(私有)和protected(保護(hù))。公有成員:作為類與外部的接口,可以被外部的任何函數(shù)訪問。私有成員:只允許本類的函數(shù)訪問。缺省情況下,類的成員都為私有。保護(hù)成員:與私有成員類似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類的影響不同4.5.3類的成員函數(shù)1.成員函數(shù)的聲明一般在類中只對(duì)成員函數(shù)進(jìn)行原型聲明,而把其實(shí)現(xiàn)放在類外。成員函數(shù)聲明的一般形式:<類型標(biāo)識(shí)符><類名>::<成員函數(shù)名>(<形參表>){<函數(shù)體>}例4-1中成員函數(shù)SetTime()和ShowTime()的實(shí)現(xiàn)如下:Clock類的成員函數(shù)的實(shí)現(xiàn):voidclock::SetTime(intnewh,intnewm,intnews){hour=newh;minute=newm;second=news;}voidclock::ShowTime(){cout<<hour<<":"<<minute<<":"<<second<<endl;}2.帶默認(rèn)值的成員函數(shù)類的成員函數(shù)也可以有默認(rèn)形參值,其調(diào)用規(guī)則同普通函數(shù)相同。例如Clock類的SetTime()函數(shù),就可以使用默認(rèn)值:voidClock::SetTime(intnewh=0,intnewm=0,intnews=0){hour=newh;minute=newm;second=news;}這樣,如果調(diào)用這個(gè)函數(shù)時(shí)沒有給出實(shí)參值,就按照默認(rèn)形參值將時(shí)鐘設(shè)置到零點(diǎn)。3.內(nèi)聯(lián)成員函數(shù)類的成員函數(shù)也可以聲明為內(nèi)聯(lián)函數(shù),方式如下:顯式聲明:在成員函數(shù)聲明或?qū)崿F(xiàn)時(shí)在類型標(biāo)識(shí)符前加關(guān)鍵字inline。隱式聲明:直接將函數(shù)體放在類聲明中??梢詫⒗?-1中Clock類定義如下:classClock{private:inthour,minute,second;public:voidSetTime(intnewh,intnewm,intnews);voidShowTime();{cout<<hour<<":"<<minute<<":"<<second<<endl;}};inlinevoidclock::ShowTime(){cout<<hour<<":"<<minute<<":"<<second<<endl;}4.5.4對(duì)象類實(shí)際上是一種抽象機(jī)制,它描述了一類問題的共同屬性和行為。在C++中,類的對(duì)象就是具有該類類型的某一特定的實(shí)體。我們可以把類理解為一種用戶自定義的數(shù)據(jù)類型,對(duì)象就是這種數(shù)據(jù)類型的變量。對(duì)象之間通過各自的屬性值(數(shù)據(jù)成員)加以區(qū)分(即對(duì)象具有不同的狀態(tài))。聲明一個(gè)對(duì)象的方式:類名對(duì)象名;比如:ClockmyClock;就聲明了一個(gè)時(shí)鐘類類型的對(duì)象myClock。聲明了類及其對(duì)象,我們就可以訪問對(duì)象的公有成員。這種訪問采用的是“.”操作符,其一般形式是:對(duì)象名.公有成員函數(shù)名(參數(shù)名)例如:用myClock.ShowTime()的形式訪問類Clock的對(duì)象myClock的成員函數(shù)ShowTime()。4.5.5對(duì)象數(shù)組數(shù)組的元素可以是基本類型的數(shù)據(jù),也可以是用戶自定義類型的數(shù)據(jù),對(duì)象數(shù)組就是指數(shù)組元素為對(duì)象的數(shù)組.對(duì)象數(shù)組中的各個(gè)元素必須是屬于同一個(gè)類的若干對(duì)象。聲明對(duì)象數(shù)組的一般形式如下:<類名><數(shù)組名>[下標(biāo)表達(dá)式]…其中,<類名>指出對(duì)象數(shù)組元素所屬的類;[下標(biāo)表達(dá)式]給出數(shù)組的維數(shù)和大小。例如,聲明語句ClockC1[10];定義了一個(gè)一維的對(duì)象數(shù)組C1,該數(shù)組有10個(gè)元素,每個(gè)元素都是Clock類的對(duì)象。聲明了對(duì)象數(shù)組之后,就可以引用其數(shù)組元素。該數(shù)組元素是一個(gè)對(duì)象,故只能訪問其公有成員。引用數(shù)組元素的一般形式如下:<數(shù)組名>[下標(biāo)].<公有成員名>4.5.6程序?qū)嵗纠?-2】時(shí)鐘類的完整程序。#include<iostream.h>classClock//時(shí)鐘類的聲明{private://私有數(shù)據(jù)成員inthour,minute,second;public://外部接口,公有成員函數(shù)voidSetTime(intnewh=0,intnewm=0,intnews=0);voidShowTime();};//時(shí)鐘類成員函數(shù)的具體實(shí)現(xiàn)voidClock::SetTime(intnewh,intnewm,intnews) { hour=newh; minute=newm; second=news; } inlinevoidclock::ShowTime() { cout<<hour<<":"<<minute<<":"<<second<<endl; } //主函數(shù) voidmain() { ClockmyClock;//定義對(duì)象myClock cout<<"Firsttimesetandoutput:"<<endl; myClock.SetTime();//設(shè)置時(shí)間為默認(rèn)值 myClock.ShowTime();//顯示時(shí)間 cout<<"Secondtimesetandoutput:"<<endl; myClock.SetTime(9,00,00);//設(shè)置時(shí)間為9:00:00 myClock.ShowTime();//顯示時(shí)間 }程序運(yùn)行結(jié)果為:Firsttimesetandoutput:0:0:0Secondtimesetandoutput:9:00:00【例4-3】對(duì)象數(shù)組例題。#include<iostream.h>classdate{private: intyear,month,day;public: date(inty,intm,intd); voidprint();};date::date(inty=2000,intm=1,intd=1){ year=y; month=m; day=d;}voiddate::print(){ cout<<year<<"."<<month<<"."<<day<<endl;}voidmain(){dateday[4]{date(2001,8,11),date(2001,8,12),date(2001,8,13),date(2001,8,14)}; for(inti=0;i<4;i++) days[i].print();}程序運(yùn)行結(jié)果為4.6構(gòu)造函數(shù)和析構(gòu)函數(shù)在聲明一個(gè)對(duì)象的時(shí)候,可以同時(shí)給它的數(shù)據(jù)成員賦初值。在聲明對(duì)象的時(shí)候進(jìn)行的數(shù)據(jù)成員設(shè)置,稱為對(duì)象的初始化。在特定對(duì)象使用結(jié)束時(shí),還經(jīng)常需要進(jìn)行一些清理工作。C++程序中的初始化和清理工作分別由兩個(gè)特殊的成員函數(shù)來完成,它們就是構(gòu)造函數(shù)和析構(gòu)函數(shù)。4.6.1構(gòu)造函數(shù)構(gòu)造函數(shù)是在類中聲明的一種特殊的成員函數(shù),作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值初始化對(duì)象.構(gòu)造函數(shù)的特征:函數(shù)名與類名相同;沒有返回值;可以帶有參數(shù)表;可以帶默認(rèn)的形參值;也可以重載.【例4-4】構(gòu)造函數(shù)例題classClock{private:inthour,minute,second;public:clock(intnewh,intnewm,intnews);//構(gòu)造函數(shù)voidSetTime(intnewh,intnewm,intnews);voidShowTime();};構(gòu)造函數(shù)的實(shí)現(xiàn):Clock::Clock(intnewh,intnewm,intnews){hour=h;minute=m;second=s;}下面我們來看一看建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:voidmain(){Clockc(0,0,0);c.ShowTime();c.SetTime(9,00,00);}在建立對(duì)象c時(shí),會(huì)隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。由于Clock類中定義了構(gòu)造函數(shù),所以編譯系統(tǒng)就不會(huì)再為其生成默認(rèn)的構(gòu)造函數(shù)。而這里自定義的構(gòu)造函數(shù)帶有形參,所以建立對(duì)象時(shí)就必須給出初始值,用來作為調(diào)用構(gòu)造函數(shù)時(shí)的實(shí)參。4.6.2拷貝構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參是本類對(duì)象的引用。其作用是使用一個(gè)已經(jīng)存在的對(duì)象(由拷貝構(gòu)造函數(shù)的參數(shù)指定的對(duì)象)去初始化一個(gè)新的同類的對(duì)象。定義一個(gè)拷貝構(gòu)造函數(shù)的一般形式為:class類名{public:類名(形參表);//構(gòu)造函數(shù)類名(類名&對(duì)象名);//拷貝構(gòu)造函數(shù)};類名::類名(類名&對(duì)象名);//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){函數(shù)體}下面給出一個(gè)拷貝構(gòu)造函數(shù)的例子:對(duì)于屏幕上的一個(gè)點(diǎn),我們可以通過給出水平和垂直兩個(gè)方向的坐標(biāo)值X和Y來確定。聲明一個(gè)點(diǎn)類Point如下:classPoint{private:intX,Y;public:Point(intxx=0,intyy=0){X=xx;Y=yy;}//構(gòu)造函數(shù)Point(Point&p);//拷貝構(gòu)造函數(shù)intGetx(){returnX;}intGety(){returnY;}};類中聲明了內(nèi)聯(lián)構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù)??截悩?gòu)造函數(shù)的實(shí)現(xiàn)如下:Point::Point(point&p){X=p.X;Y=p.Y;cout<<"拷貝構(gòu)造函數(shù)被調(diào)用"<<endl;}拷貝構(gòu)造函數(shù)在三種情況下會(huì)被調(diào)用:當(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í)?!纠?-5】Point類的完整程序。(對(duì)于屏幕上的一個(gè)點(diǎn),我們可以通過給出X軸和Y軸的坐標(biāo)來確定)程序代碼如下://在程序主函數(shù)中,三個(gè)部分分別給出拷貝構(gòu)造函數(shù)調(diào)用的三種情況。#include<iostream.h>classPoint//point類的聲明{private://私有數(shù)據(jù) intX,Y;public://外部接口 Point(intxx=0,intyy=0){X=xx;Y=yy;}//構(gòu)造函數(shù) Point(Point&p);//拷貝構(gòu)造函數(shù) intGetX(){returnX;} intGetY(){returnY;}};//成員函數(shù)的實(shí)現(xiàn)Point::Point(Point&p){ X=p.X; Y=p.Y; cout<<"拷貝構(gòu)造函數(shù)被調(diào)用"<<endl;}//形參為Point類對(duì)象的函數(shù)voidfun1(Pointp){cout<<p.GetX()<<endl;}//返回值為Point類對(duì)象的函數(shù)Pointfun2(){ PointA(1,2); returnA;}//主程序voidmain(){ PointA(4,5)//第一個(gè)對(duì)象A PointB(A)//情況一,用A初始化B,第一次調(diào)用拷貝構(gòu)造函數(shù) cout<<B.GetX()<<endl; fun1(B);//情況二,對(duì)象B作為fun1的實(shí)參。第二次調(diào)用拷貝構(gòu)造函數(shù) B=fun2();//情況三,函數(shù)的返回值是類對(duì)象,函數(shù)返回時(shí),調(diào)用拷貝構(gòu)造函數(shù) cout<<B.GetX()<<endl;}程序運(yùn)行結(jié)果為:拷貝構(gòu)造函數(shù)被調(diào)用4拷貝構(gòu)造函數(shù)被調(diào)用4拷貝構(gòu)造函數(shù)被調(diào)用14.6.3析構(gòu)函數(shù)析構(gòu)函數(shù)與構(gòu)造函數(shù)的作用幾乎正好相反,它用來完成對(duì)象被刪除前的一些清理工作。析構(gòu)函數(shù)是在對(duì)象的生存期即將結(jié)束的時(shí)刻由系統(tǒng)自動(dòng)調(diào)用的。它的調(diào)用完成之后,對(duì)象也就消失了,相應(yīng)的內(nèi)存空間也被釋放。與構(gòu)造函數(shù)一樣,析構(gòu)函數(shù)也是類的一個(gè)公有函數(shù)成員,它的名稱是在類名前面加“~”構(gòu)成,沒有返回值。和構(gòu)造函數(shù)不同的是析構(gòu)函數(shù)不接受任何參數(shù),但可以是虛函數(shù)(將在第8章中介紹)。如果不進(jìn)行顯式說明,系統(tǒng)將自動(dòng)生成一個(gè)不做任何事的默認(rèn)析構(gòu)函數(shù)。例如:給時(shí)鐘類加入一個(gè)空的內(nèi)聯(lián)析構(gòu)函數(shù),其功能和系統(tǒng)自動(dòng)生成的默認(rèn)析構(gòu)函數(shù)相同。classClock{private:inthour,minute,second;public:Clock();voidSetTime(intnewh,intnewm,intnews);voidShowTime();~Clock(){}};4.7類的組合類的組合(也稱聚集),描述的就是一個(gè)類內(nèi)嵌其他類的對(duì)象作為成員的情況,它們之間的關(guān)系是一種包含與被包含的關(guān)系。在創(chuàng)建類的對(duì)象時(shí),如果這個(gè)類具有內(nèi)嵌對(duì)象成員,那么各個(gè)內(nèi)嵌對(duì)象也將被自動(dòng)創(chuàng)建。因此,在創(chuàng)建對(duì)象時(shí)既要對(duì)本類的基本數(shù)據(jù)成員進(jìn)行初始化,又要對(duì)內(nèi)嵌對(duì)象成員進(jìn)行初始化。這時(shí),這些對(duì)象的構(gòu)造函數(shù)被調(diào)用的順序就成為突出的問題。組合類構(gòu)造函數(shù)定義的一般形式為:類名::類名(形參表):內(nèi)嵌對(duì)象1(形參表),內(nèi)嵌對(duì)象2(形參表),…{類的初始化}其中,“內(nèi)嵌對(duì)象1(形參表),內(nèi)嵌對(duì)象2(形參表),……”稱作初始化列表,可以用于完成對(duì)內(nèi)嵌對(duì)象的初始化。對(duì)類中一般的數(shù)據(jù)成員也可以這樣初始化,例如,例4-5中Point類的構(gòu)造函數(shù)也可以這樣寫:Point(intxx=0,intyy=0):X(xx),Y(yy){}在聲明一個(gè)組合類的對(duì)象時(shí),不僅它自身的構(gòu)造函數(shù)將被調(diào)用,而且還將調(diào)用其內(nèi)嵌對(duì)象的構(gòu)造函數(shù)。這時(shí)構(gòu)造函數(shù)的調(diào)用順序是:1.按照內(nèi)嵌對(duì)象在組合類聲明中出現(xiàn)的次序,依次調(diào)用內(nèi)嵌對(duì)象的構(gòu)造函數(shù)。2.執(zhí)行本類構(gòu)造函數(shù)的函數(shù)體。如果聲明組合類的對(duì)象時(shí)沒有指定對(duì)象的初始值,則自動(dòng)調(diào)用無形參的構(gòu)造函數(shù)。這時(shí)相應(yīng)地,也調(diào)用內(nèi)嵌對(duì)象的無形參的構(gòu)造函數(shù)。析構(gòu)函數(shù)的調(diào)用執(zhí)行順序與構(gòu)造函數(shù)剛好相反?!纠?-6】類的組合——線段距離Distance類。我們使用一個(gè)類來描述屏幕上兩個(gè)點(diǎn)之間的距離,使用上一節(jié)聲明的Point類來表示點(diǎn)。即Distance類的數(shù)據(jù)成員包括了Point類的兩個(gè)對(duì)象p1和p2.程序代碼如下:#include<iostream.h>#include<math.h>classPoint//Point類聲明{private: intX,Y;public: Point(intxx=0,intyy=0){X=xx;Y=yy;} Point(Point&p); intGetX(){returnX;} intGetY(){returnY;}};Point::Point(Point&p)//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){ X=p.X; Y=p.Y; cout<<"拷貝構(gòu)造函數(shù)被調(diào)用"<<endl;}//類的組合classDistance//Distance類的聲明{private://私有數(shù)據(jù)成員 Pointp1,p2;//Point類的對(duì)象p1,p2 doubledist;public://外部接口 Distance(Pointxp1,Pointxp2);doubleGetDis(){returndist;}};//組合類的構(gòu)造函數(shù)Distance::Distance(Pointxp1,Pointxp2):p1(xp1),p2(xp2){ cout<<"Distance構(gòu)造函數(shù)被調(diào)用"<<endl; doublex=double(p1.GetX()-p2.GetX()); doubley=double(p1.GetY()-p2.GetY()); dist=sqrt(x*x+y*y);}//主函數(shù)voidmain(){ Pointmyp1(1,1),myp2(4,5);//聲明Point類的對(duì)象 Distancemyd(myp1,myp2);//聲明Distance類的對(duì)象 cout<<"TheDistanceis:"; cout<<myd.GetDis()<<endl;}程序的運(yùn)行結(jié)果為:Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Point拷貝構(gòu)造函數(shù)被調(diào)用Distance構(gòu)造函數(shù)被調(diào)用TheDistanceis:5分析:主程序在執(zhí)行時(shí),首先生成兩個(gè)Point類的對(duì)象,然后構(gòu)造Distance類的對(duì)象myd,最后輸出兩點(diǎn)的距離。在整個(gè)運(yùn)行過程中,Point類的拷貝構(gòu)造函數(shù)被調(diào)用了4次,而且都是在Distance類構(gòu)造函數(shù)體運(yùn)行之前進(jìn)行的,它們分別是兩個(gè)對(duì)象在Distance構(gòu)造函數(shù)進(jìn)行函數(shù)參數(shù)形實(shí)結(jié)合和初始化內(nèi)嵌對(duì)象時(shí)調(diào)用的,剛好是上一節(jié)所講拷貝構(gòu)造函數(shù)調(diào)用的前兩種情況。兩點(diǎn)的距離由Distance類的構(gòu)造函數(shù)求得,存放在其私有數(shù)據(jù)成員dist中,只能通過公有成員函數(shù)GetDis()來訪問。4.8類模板C++的模板機(jī)制是將類型作為參數(shù)的一種抽象結(jié)構(gòu),即支持類型化參數(shù)。類模板使用戶可以為類聲明一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取任意類型(包括系統(tǒng)預(yù)定義的和用戶自定義的)----類模板是對(duì)類的抽象。類模板的聲明形式如下:template<模板參數(shù)表>類聲明“模板參數(shù)表”中可以包含下列內(nèi)容:=1\*GB3①class標(biāo)識(shí)符(指明可以接受一個(gè)類型參數(shù)。)=2\*GB3②類型說明符標(biāo)識(shí)符(指明可以接受一個(gè)由“類型說明符”所規(guī)定類型的常量作為參數(shù)。)當(dāng)“模板參數(shù)表”同時(shí)包含上述多項(xiàng)內(nèi)容時(shí),各項(xiàng)內(nèi)容以逗號(hào)分隔。應(yīng)該注意的是,模板類的成員函數(shù)必須是函數(shù)模板。使用一個(gè)模板類來建立對(duì)象時(shí)(類模板的實(shí)例化---類),應(yīng)按如下形式聲明:模板<模板參數(shù)表>對(duì)象名1,…,對(duì)象名n;其中“模板參數(shù)表”由用逗號(hào)分隔的若干類型標(biāo)識(shí)符或常量表達(dá)式構(gòu)成。這里,“模板參數(shù)表”中的參數(shù)與類模板聲明時(shí)“模板參數(shù)表”中的參數(shù)一一對(duì)應(yīng)。經(jīng)這樣聲明后,系統(tǒng)會(huì)根據(jù)指定的參數(shù)類型和常量值生成一個(gè)類,然后建立該類的對(duì)象?!纠?-7】類模板應(yīng)用舉例。#include<iostream.h
溫馨提示
- 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. 人人文庫(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 商場(chǎng)內(nèi)的商鋪?zhàn)赓U合同
- 停車場(chǎng)承包合同
- 技術(shù)培訓(xùn)委托合同書
- 草籽草坪采購(gòu)合同
- 房屋獨(dú)家代理銷售合同
- 車庫(kù)轉(zhuǎn)讓合同協(xié)議書
- 醫(yī)療美容手術(shù)項(xiàng)目合同協(xié)議書
- 高層管理團(tuán)隊(duì)建設(shè)活動(dòng)方案
- 上海餐飲商鋪?zhàn)赓U合同
- 奶茶店轉(zhuǎn)讓合同(新標(biāo)準(zhǔn)版)8篇
- 第二十一章會(huì)陰部美容手術(shù)講解
- 【道法】歷久彌新的思想理念課件 2024-2025學(xué)年統(tǒng)編版道德與法治七年級(jí)下冊(cè)
- 2025年度iPhone手機(jī)租賃與虛擬現(xiàn)實(shí)體驗(yàn)合同3篇
- 2025年度消防工程安全防護(hù)措施設(shè)計(jì)固定總價(jià)合同范本3篇
- 蘇北四市(徐州、宿遷、淮安、連云港)2025屆高三第一次調(diào)研考試(一模)語文試卷(含答案)
- 食品企業(yè)危機(jī)管理應(yīng)對(duì)方案
- 2024年濟(jì)南廣播電視臺(tái)招聘工作人員筆試真題
- 市場(chǎng)消防安全課件
- 名師工作室建設(shè)課件
- 2025-2025學(xué)年度人教版小學(xué)五年級(jí)美術(shù)下冊(cè)教學(xué)計(jì)劃
- 《電力建設(shè)工程施工安全管理導(dǎo)則》(NB∕T 10096-2018)
評(píng)論
0/150
提交評(píng)論