




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
會(huì)計(jì)學(xué)1C程序設(shè)計(jì)語言類教材中強(qiáng)調(diào)了兩種方法:結(jié)構(gòu)化程序設(shè)計(jì)面向?qū)ο蟪绦蛟O(shè)計(jì)具體內(nèi)容參看教材p95-96第1頁/共50頁二面向?qū)ο蟪绦蛟O(shè)計(jì)的基本特點(diǎn)面向?qū)ο筌浖_發(fā)方法是吸收了軟件工程領(lǐng)域有益的概念和有效的方法而發(fā)展起來的一種軟件開發(fā)方法。它集抽象性、封裝性、繼承性和多態(tài)性于一體,可以幫助人們開發(fā)出模塊化、數(shù)據(jù)抽象程度高的,體現(xiàn)信息隱蔽、可復(fù)用、易修改、易擴(kuò)充等特性的程序。在系統(tǒng)分析與設(shè)計(jì)中,抽象用來確定必要的信息系統(tǒng)需求,刪除不必要的部分。為了突出重點(diǎn),抽象有意地忽略信息系統(tǒng)的某些性質(zhì)、屬性或功能。抽象是一種突出重點(diǎn)、去掉細(xì)節(jié)的總結(jié)。例如:地圖的抽象,根據(jù)抽象的層次,地圖可分為國家地圖、行政省或地區(qū)地圖、城市地圖、郵政代碼地圖等。參看教材p97第2頁/共50頁封裝或信息隱蔽
封裝或信息隱蔽指軟件的組成部分(模塊、子程序、方法等)應(yīng)該互相獨(dú)立,或者隱藏設(shè)計(jì)的細(xì)節(jié)。
在系統(tǒng)分析和設(shè)計(jì)中,系統(tǒng)分析員把問題域分解為小的封裝單元,這些分析和設(shè)計(jì)決定最終成為軟件模塊,封裝就是有利于靈活地局部修改和維護(hù)軟件模塊。第3頁/共50頁封裝或信息隱蔽用于以下兩種情況1、當(dāng)人們只能使用或接觸整個(gè)系統(tǒng)的某個(gè)子集時(shí)。例如:當(dāng)開發(fā)一個(gè)信息系統(tǒng)時(shí),開發(fā)小組成員受命開發(fā)系統(tǒng)的某個(gè)部分,不需接觸其它成員開發(fā)的部分。所以,封裝或信息隱蔽適合于團(tuán)隊(duì)開發(fā)。2.有意防止信息系統(tǒng)的某些部件注意或利用系統(tǒng)的其它部件。這涉及到封裝的另外一個(gè)方面----分配責(zé)任。正如現(xiàn)實(shí)生活中一個(gè)人負(fù)有某種責(zé)任,信息系統(tǒng)中的一個(gè)部件也有自己的責(zé)任,比如自動(dòng)取款機(jī)的付鈔功能,系統(tǒng)其它部件則擔(dān)任付鈔以外的其它責(zé)任。注意:在傳統(tǒng)方法中,封裝通常局限于將功能和數(shù)據(jù)分開封裝;而在面向?qū)ο蟮姆椒ㄖ?,封裝將功能和數(shù)據(jù)同時(shí)裝入對(duì)象中。第4頁/共50頁繼承
繼承是表示相似性質(zhì)的機(jī)制。正如一個(gè)人同時(shí)繼承父母的外貌特點(diǎn)一樣,信息系統(tǒng)組成成分也從有關(guān)部件繼承某些特點(diǎn)。例如:右圖顯示了‘人’和‘教師’、‘學(xué)生’及‘管理者’之間的繼承關(guān)系。
‘人’和‘教師’、‘學(xué)生’及‘管理者’之間是繼承(父子)關(guān)系,‘教師’、‘學(xué)生’、‘管理者’之間是兄弟關(guān)系。‘人’的特點(diǎn)如姓名、性別、年齡等,為繼承層次中所有子節(jié)點(diǎn)繼承;有些特點(diǎn)則為子節(jié)點(diǎn)獨(dú)有,如授課時(shí)間只對(duì)‘教師’適用,平均分?jǐn)?shù)只對(duì)‘學(xué)生’適用,頭銜只對(duì)‘管理者’適用。同樣,一些‘人’能做的事也對(duì)‘教師’、‘學(xué)生’及‘管理者’適用,例如吃飯、睡覺等,同樣,有些事則為子節(jié)點(diǎn)獨(dú)有。注意:繼承在層次中是自上而下單向進(jìn)行的。管理者人學(xué)生教師第5頁/共50頁多態(tài)多態(tài)一般指具有多種形態(tài)的能力。如:水有三種形態(tài),液體、氣體和固體。在某種程度上,在車?yán)镉^察交通燈的反應(yīng)是多態(tài)的,當(dāng)交通燈閃現(xiàn)不同顏色時(shí),人的反應(yīng)是不同的。又如打印程序可以打印字符、數(shù)字、圖形和圖像,打印程序由于知道如何打印圖文,因而是多態(tài)的。第6頁/共50頁第二節(jié)面向?qū)ο蟮姆椒嫦驅(qū)ο笫且环N軟件開發(fā)方法,軟件開發(fā)的目的是為了進(jìn)行數(shù)據(jù)處理,所以程序中包含了數(shù)據(jù)以及對(duì)數(shù)據(jù)的操作代碼。面向?qū)ο蟮木幊探鉀Q問題的思路從對(duì)象(人、地方、事情等)角度入手,而不像傳統(tǒng)方法與結(jié)構(gòu)化方法一樣從功能入手。面向?qū)ο蟮拈_發(fā)強(qiáng)調(diào)從問題域的概念到軟件程序和界面的直接映射;心理學(xué)的研究也表明,把客觀世界看成是許多對(duì)象更接近人類的自然思維方式。對(duì)象比函數(shù)更為穩(wěn)定;軟件需求的變動(dòng)往往是功能相關(guān)的變動(dòng),而其功能的執(zhí)行者----對(duì)象----通常不會(huì)有大的變動(dòng)。另外,面向?qū)ο蟮拈_發(fā)也支持、鼓勵(lì)軟件工程實(shí)踐中的信息隱藏、數(shù)據(jù)抽象和封裝。在一個(gè)對(duì)象內(nèi)部的修改被局部隔離。面向?qū)ο箝_發(fā)的軟件易于修改、擴(kuò)充和維護(hù)。第7頁/共50頁面向?qū)ο缶幊?---基本概念在面向?qū)ο缶幊讨?,程序被看作是相互協(xié)作的對(duì)象集合,每個(gè)對(duì)象都是某個(gè)類的實(shí)例,所有的類構(gòu)成一個(gè)通過繼承關(guān)系相聯(lián)系的層次結(jié)構(gòu)。面向?qū)ο蟮恼Z言常常具有以下特征:對(duì)象生成功能、消息傳遞機(jī)制、類和遺傳機(jī)制。這些概念當(dāng)然可以并且也已經(jīng)在其他編程語言中單獨(dú)出現(xiàn),但只有在面向?qū)ο笳Z言中,他們才共同出現(xiàn),以一種獨(dú)特的合作方式互相協(xié)作、互相補(bǔ)充。過程化編程模式:參數(shù)輸入-----|代碼|------結(jié)果輸出為實(shí)現(xiàn)某個(gè)功能,參數(shù)被傳入某個(gè)處理過程,最后傳回計(jì)算結(jié)果。面向?qū)ο缶幊棠J剑航缑?-----|對(duì)象數(shù)據(jù)結(jié)構(gòu)和操作第8頁/共50頁OO編程中,功能是通過與對(duì)象的通訊獲得的。對(duì)象可以被定義為一個(gè)封裝了狀態(tài)和行為的實(shí)體;或者說是數(shù)據(jù)結(jié)構(gòu)(或?qū)傩裕┖筒僮?。狀態(tài)實(shí)際上是為執(zhí)行行為而必須存于對(duì)象之中的數(shù)據(jù)、信息。對(duì)象的界面,也可稱之為協(xié)議,是一組對(duì)象能夠響應(yīng)的消息的集合。
消息是對(duì)象通訊的方式,因而也是獲得功能的方式。對(duì)象受到發(fā)給他的消息后,或者執(zhí)行一個(gè)內(nèi)部操作(有時(shí)成為方法或過程),或者再去調(diào)用其他對(duì)象的操作。所有對(duì)象都是類的實(shí)例。類是具有相同特點(diǎn)的對(duì)象的集合,或者也可以說,類是可用于產(chǎn)生對(duì)象的一個(gè)模版。對(duì)象響應(yīng)一個(gè)消息而調(diào)用的方法,由接受該消息的對(duì)象自己決定。類可以以一種層次結(jié)構(gòu)來安排。第9頁/共50頁第三節(jié)面向?qū)ο蟮臉?biāo)記參看教材p100-101第10頁/共50頁第四節(jié)類與對(duì)象一類和類定義對(duì)象和對(duì)象定義初始化問題靜態(tài)成員小結(jié)第11頁/共50頁一類和類定義----1、類的聲明類和對(duì)象是面向?qū)ο蟪绦蛟O(shè)計(jì)(OOP)的兩個(gè)最基本概念。所謂對(duì)象就是客觀事物在計(jì)算機(jī)中的抽象描述;類是對(duì)具有相似屬性和行為的一組對(duì)象的統(tǒng)一描述。類的定義
C++的類是在結(jié)構(gòu)體的基礎(chǔ)上擴(kuò)充而來的。類是把各種不同類型的數(shù)據(jù)(稱為數(shù)據(jù)成員)和對(duì)數(shù)據(jù)的操作(成員函數(shù))組織在一起而形成的用戶自定義的數(shù)據(jù)類型。
C++中,類定義包括類說明和類實(shí)現(xiàn)兩大部分。說明部分提供了對(duì)該類所有數(shù)據(jù)成員和成員函數(shù)的描述,而實(shí)現(xiàn)部分提供了所有成員函數(shù)的實(shí)現(xiàn)代碼。第12頁/共50頁類定義的一般形式為:class類名{private:
數(shù)據(jù)成員或成員函數(shù)
protected:
數(shù)據(jù)成員或成員函數(shù)
public:
數(shù)據(jù)成員或成員函數(shù)};
//注意:此處分號(hào)不要少<各成員函數(shù)的實(shí)現(xiàn)代碼>定義類時(shí),當(dāng)未指明成員是哪部分時(shí),默認(rèn)是屬于private成員,但一般不要采用默認(rèn)形式。第13頁/共50頁幾點(diǎn)說明(1)大括號(hào)的部分是類的成員(數(shù)據(jù)成員和函數(shù)成員),它們分成三部分,分別由private、public、proctected三個(gè)關(guān)鍵字后跟冒號(hào)來指定。這三部分可以任何順序出現(xiàn),且在一個(gè)類的定義中,這三部分并非必須同時(shí)出現(xiàn)。(2)類的數(shù)據(jù)成員可以使任何數(shù)據(jù)類型;(3)類的數(shù)據(jù)成員允許使用存儲(chǔ)類型static,但其它三種存儲(chǔ)類型不能使用;(4)類中數(shù)據(jù)成員不允許使用表達(dá)式進(jìn)行初始化;(5)類中數(shù)據(jù)成員與成員函數(shù)可用const修飾。(6)經(jīng)常習(xí)慣地將類定義的說明部分或者整個(gè)定義部分(包含實(shí)現(xiàn)部分)放到一個(gè)頭文件中。第14頁/共50頁如:下例中定義描述圖書的類定義
classRecord{private://private成員
charbookname[20];//數(shù)據(jù)成員bookname,
//用于表示圖書的名稱
intnumber;//數(shù)據(jù)成員number,表示圖書編號(hào)
public: //public成員
voidregist(char*a,intb);//成員函數(shù)regist,用于給
//各數(shù)據(jù)成員賦值
voidshow();//成員函數(shù)show,顯示各數(shù)據(jù)成員的值
};第15頁/共50頁根據(jù)類的定義,可看出:類是實(shí)現(xiàn)封裝的工具,所謂封裝就是將類的成員按使用或存取的方式分類,有條件地限制對(duì)類成員的使用,而封裝是通過public和private與成員函數(shù)實(shí)現(xiàn)的。private的成員構(gòu)成類的內(nèi)部狀態(tài),public的成員則構(gòu)成與外界通信的接口,通過public的成員函數(shù)來使用private的數(shù)據(jù)成員,從而在C++中實(shí)現(xiàn)了封裝。第16頁/共50頁2、類成員的訪問控制從訪問權(quán)限上來分,類的成員又分為:公有的(public)、私有的(private)和保護(hù)的(protected)三類。公有的成員用public來說明,公有部分往往是一些操作(即成員函數(shù)),它是提供給用戶的接口功能。這部分成員可以在程序中引用。私有的成員用private來說明,私有部分通常是一些數(shù)據(jù)成員,這些成員是用來描述該類中的對(duì)象的屬性的,用戶是無法訪問它們的,只有成員函數(shù)或經(jīng)特殊說明的函數(shù)才可以引用它們,它們是被用來隱藏的部分。保護(hù)的成員用protected來說明,這種成員只有該類的派生類可以訪問,其余的在這個(gè)類外不能訪問。保護(hù)類(protected)將在以后介紹。
第17頁/共50頁Who可以直接訪問Who不能直接訪問目的與用途private本類Public成員函數(shù)、本類保護(hù)成員函數(shù)、類的友元對(duì)象數(shù)據(jù)成員一般放在私有部分,實(shí)現(xiàn)信息隱蔽。protected本類公有成員函數(shù)、本類派生類(公有和私有派生)成員函數(shù)本類對(duì)象、派生類對(duì)象便于子類訪問的成員一般放在保護(hù)部分。public本類公有成員函數(shù)、派生類成員函數(shù)、公有派生類對(duì)象私有派生類對(duì)象成員函數(shù)一般放在公有部分,實(shí)現(xiàn)共享。類成員的訪問權(quán)限表第18頁/共50頁返回類名:私有部分的成員保護(hù)部分的成員公有部分的成員對(duì)于一個(gè)無繼承關(guān)系的單一類(獨(dú)立類),其訪問權(quán)限可參考下圖:該類的對(duì)象第19頁/共50頁3、類成員函數(shù)的特性類的成員函數(shù)可以分為內(nèi)聯(lián)函數(shù)和外聯(lián)函數(shù)。內(nèi)聯(lián)函數(shù)是指那些定義在類體內(nèi)的成員函數(shù),即該函數(shù)的函數(shù)體放在類體內(nèi)。而說明在類體內(nèi),定義在類體外的成員函數(shù)叫外聯(lián)函數(shù)。外聯(lián)函數(shù)的函數(shù)體在類的實(shí)現(xiàn)部分。
引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題。因?yàn)閮?nèi)聯(lián)函數(shù)在調(diào)用時(shí)不是像一般函數(shù)那樣要轉(zhuǎn)去執(zhí)行被調(diào)用函數(shù)的函數(shù)體,執(zhí)行完成后再轉(zhuǎn)回調(diào)用函數(shù)中,執(zhí)行其后語句,而是在調(diào)用函數(shù)處用內(nèi)聯(lián)函數(shù)體的代碼來替換,這樣將會(huì)節(jié)省調(diào)用開銷,提高運(yùn)行速度。
第20頁/共50頁在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)行替換。顯然,這種做法不會(huì)產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題,但是由于在編譯時(shí)將函數(shù)休中的代碼被替代到程序中,因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷,而在時(shí)間代銷上不象函數(shù)調(diào)用時(shí)那么大,可見它是以目標(biāo)代碼的增加為代價(jià)來換取時(shí)間的節(jié)省。內(nèi)聯(lián)函數(shù)的定義方法
內(nèi)聯(lián)函數(shù)的定義方法與一般函數(shù)一樣,只是在函數(shù)定義的頭前加上關(guān)鍵字inline即可。如:
inlineintadd_int(intx,inty,intz)
{
returnx+y+z;
}返回第21頁/共50頁二對(duì)象和對(duì)象定義----1、對(duì)象的創(chuàng)建類是抽象的概念,而對(duì)象是具體的,類只是一種數(shù)據(jù)類型,而對(duì)象是屬于該類(數(shù)據(jù)類型)的一個(gè)變量,占用了各自的存儲(chǔ)單元,每個(gè)對(duì)象各自具有了該類的一套數(shù)據(jù)成員(靜態(tài)成員除外),而所有成員函數(shù)是所有對(duì)象共有的。每個(gè)對(duì)象的函數(shù)成員都通過指針指向同一個(gè)代碼空間。(參看教材p124圖)對(duì)象的定義格式:
(1)class類名
{……}對(duì)象1,對(duì)象2,…,對(duì)象n;(2)類名對(duì)象1,對(duì)象2,…,對(duì)象n;(3)類名對(duì)象1(參數(shù)表),…,對(duì)象n(參數(shù)表);
如:TDatedate1,date2,*Pdate,date[31];
第22頁/共50頁2、對(duì)象成員的使用訪問對(duì)象的成員包括讀寫對(duì)象的數(shù)據(jù)成員和調(diào)用它的成員函數(shù),其訪問格式是:
<對(duì)象名>.<成員名>
或者
<對(duì)象名>.<成員名>(<參數(shù)表>)
前者用來表示數(shù)據(jù)成員的,后者用來表示成員函數(shù)的。如:上例中已定義了類Record,則:
Recordbook1,book2;//此處的book1,book2就是Record//類型,也就是類的兩個(gè)對(duì)象可參看教材p125程序5-3-1
第23頁/共50頁如上例中,對(duì)象的主函數(shù)如下:voidmain(){Recordbook1,book2;//定義對(duì)象book1和book2//調(diào)用成員函數(shù)regist,給book1的兩個(gè)數(shù)據(jù)成員
//bookname和number賦值
book1.regist(“C++編程教程”,1001);//調(diào)用成員函數(shù)regist,給book2的兩個(gè)數(shù)據(jù)成員賦值
book2.regist(“C++語言參考”,1002);//調(diào)用成員函數(shù)show,顯示book1對(duì)象的數(shù)據(jù)成員
//bookname和number的值
book1.show();//調(diào)用成員函數(shù)show,顯示book2對(duì)象的數(shù)據(jù)成員
//bookname和number的值
book2.show();}第24頁/共50頁如改為下面的代碼,則錯(cuò)誤:voidmain(){Recordbook1,book2;//由于bookname和number是類Record的私有成員,在類外不能直接使用,即對(duì)象不能直接使用。
strcpy(book1.bookname,“C++編程教程”);book1.number=1001;strcpy(book2.bookname,“C++語言參考”);book2.number=1002;book1.show();book2.show();}第25頁/共50頁訪問對(duì)象的成員需注意以下幾點(diǎn):對(duì)于類的私有成員,只能通過其成員函數(shù)來訪問,不能在類外對(duì)私有成員訪問。2.調(diào)用成員函數(shù)時(shí)要在函數(shù)名之前加上對(duì)象名和"."即可,即先指明對(duì)象,再指明成員。也可以采用指向?qū)ο蟮闹羔榿碓L問,但要在函數(shù)名前加上指針變量名和“->”。3.任何對(duì)對(duì)象私有數(shù)據(jù)的訪問都必須通過向?qū)ο蟀l(fā)送消息來實(shí)現(xiàn),而且所發(fā)送的消息還必須是該對(duì)象能夠識(shí)別和接受的。在C++中,消息發(fā)送正是通過公有成員函數(shù)的調(diào)用來實(shí)現(xiàn)的。由于類接口隱藏了對(duì)象的內(nèi)部細(xì)節(jié),用戶只能通過類接口訪問對(duì)象,因此,在類設(shè)計(jì)中必須提供足夠的公有接口以捕獲對(duì)象的全部行為,這正是類設(shè)計(jì)中的一個(gè)最基本的要求。返回第26頁/共50頁3、對(duì)象數(shù)組參看教材p305-306第27頁/共50頁第五節(jié)構(gòu)造函數(shù)河析構(gòu)函數(shù)全局變量和靜態(tài)變量在定義時(shí),將自動(dòng)賦初值為0;局部變量在定義時(shí),其初始值不固定的。而當(dāng)對(duì)象被定義時(shí),由于對(duì)象的意義表達(dá)了現(xiàn)實(shí)世界的實(shí)體,所以一旦定義對(duì)象,就必須有一個(gè)有意義的初始值,在C++中,在定義對(duì)象的同時(shí),給該對(duì)象初始化的方法就是利用構(gòu)造函數(shù)。下面分別從三個(gè)方面講述初始化問題:
1、類中數(shù)據(jù)成員的初始化:構(gòu)造函數(shù)和析構(gòu)函數(shù)
由于在類的定義中不能對(duì)數(shù)據(jù)成員初始化,那么類中數(shù)據(jù)成員利用構(gòu)造函數(shù)進(jìn)行初始化。
2、類中常量和引用的初始化:初始化表
3、類中數(shù)據(jù)成員的初始化:初始化表
4、類的對(duì)象初始化:拷貝構(gòu)造函數(shù)第28頁/共50頁1、構(gòu)造函數(shù)和析構(gòu)函數(shù)
構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種特殊的成員函數(shù)。構(gòu)造函數(shù)的功能是在創(chuàng)建對(duì)象時(shí),使用給定的值來將對(duì)象初始化。析構(gòu)函數(shù)的功能是用來釋放一個(gè)對(duì)象的,在對(duì)象刪除前,用它來做一些清理工作,它與構(gòu)造函數(shù)的功能正好相反。下面舉一例子來說明構(gòu)造函數(shù)和析構(gòu)函數(shù)的特點(diǎn):
程序5-1
第29頁/共50頁classTDate
{
public:
TDate(inty,intm,intd);
~TDate();
intIsLeapYear();
voidPrint();
private:
intyear,month,day;
};
第30頁/共50頁//類的實(shí)現(xiàn)部分
TDate::TDate(inty,intm,intd)
{
year=y;
month=m;
day=d;
cout<<"構(gòu)造函數(shù)已被調(diào)用。\n";
}
TDate::~TDate()
{
cout<<"析構(gòu)函數(shù)被調(diào)用。\n";
}
intTDate::IsLeapYear()
{
return(year%4==0&&year%100!=0)||(year%400==0);
}
voidTDate::Print()
{
cout<<year<<"."<<month<<"."<<day<<endl;
}
第31頁/共50頁構(gòu)造函數(shù)的特點(diǎn)如下:
1)構(gòu)造函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定在類體外。
2)構(gòu)造函數(shù)是一個(gè)特殊的函數(shù),
該函數(shù)的名字與類名相同;
該函數(shù)不指定類型說明,它有隱含的返回值,該值由系統(tǒng)內(nèi)部使用。
該函數(shù)可以一個(gè)參數(shù),也可以有多個(gè)參數(shù)。
3)可以定義多個(gè)構(gòu)造函數(shù)。即構(gòu)造函數(shù)可以重載,也就是可以定義多個(gè)參數(shù)個(gè)數(shù)不同的函數(shù)。.。
4)程序中不能直接調(diào)用構(gòu)造函數(shù),在創(chuàng)建對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用構(gòu)造函數(shù)。
第32頁/共50頁析構(gòu)函數(shù)的特點(diǎn)如下:1)析構(gòu)函數(shù)是成員函數(shù),函數(shù)體可寫在類體內(nèi),也可定在類體外。2)析構(gòu)函數(shù)也是一個(gè)特殊的函數(shù)
它的名字同類名,并在前面加“~”字符,用來與構(gòu)造函數(shù)加以區(qū)別;
析構(gòu)函數(shù)不指定數(shù)據(jù)類型,并且也沒有參數(shù)。3)一個(gè)類中只可能定義一個(gè)析構(gòu)函數(shù)。4)析構(gòu)函數(shù)可以被調(diào)用,也可以系統(tǒng)調(diào)用。在下面兩種情況下,析構(gòu)函數(shù)會(huì)被自動(dòng)調(diào)用。
·如果一個(gè)對(duì)象被定義在一個(gè)函數(shù)體內(nèi),則當(dāng)這個(gè)函數(shù)結(jié)束時(shí),該對(duì)象的析構(gòu)函數(shù)被自動(dòng)調(diào)用。
·當(dāng)一個(gè)對(duì)象是使用new運(yùn)算符被動(dòng)態(tài)創(chuàng)建的,在使用delete運(yùn)算符釋放它時(shí),delete將會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。第33頁/共50頁缺省構(gòu)造函數(shù)和缺省析構(gòu)函數(shù)
在類定義時(shí)沒有定義任何構(gòu)造函數(shù)時(shí),則編譯器自動(dòng)生成一個(gè)不帶參數(shù)的缺省構(gòu)造函數(shù),其格式如下:
<類名>::<缺省構(gòu)造函數(shù)名>()
{
}
同理,如果一個(gè)類中沒有定義析構(gòu)函數(shù)時(shí),則編譯系統(tǒng)也生成一個(gè)稱為缺省析構(gòu)函數(shù),缺省析構(gòu)函數(shù)是一個(gè)空函數(shù),其格式如下:
<類名>::~<缺省析構(gòu)函數(shù)名>
{
}第34頁/共50頁2、類中常量和引用的初始化上一小節(jié)講述了應(yīng)用析構(gòu)函數(shù)對(duì)數(shù)據(jù)成員變量的初始化,那么如何初始化常量和引用?(應(yīng)用初始化表,注意在類定義中不能直接用。)返回#include<iostream.h>classiniti_data{
private:intx;int℞constfloatpi;public:
initi_data(intx1):rx(x),pi(3.14){x=x1;}
voiddisplay(){cout<<"x="<<x<<",rx="<<rx<<",pi="<<pi<<endl;}};
voidmain(){
initi_dataob(100);ob.display();
}
結(jié)果:x=100,rx=100,pi=3.14那么,從左邊例子中可以看出,初始化表的格式:析構(gòu)函數(shù):引用名(變量),常量名(常數(shù)),…{}
第35頁/共50頁3、類中對(duì)象成員的初始化1.對(duì)象成員的概念
C++中允許將一個(gè)已定義的類的對(duì)象作為另一個(gè)類的數(shù)據(jù)成員,這稱為類的組合。當(dāng)一個(gè)類的成員是某一個(gè)類的對(duì)象時(shí),則稱該對(duì)象為對(duì)象成員(或子對(duì)象)。如:
classA
{
…
};
classB
{
private:
Aa;
…
public:
…
};
在類中出現(xiàn)了子對(duì)象或稱對(duì)象成員時(shí),該類的構(gòu)造函數(shù)要包含對(duì)子對(duì)象的初始化,通常采用成員初始化表的方法來初始化子對(duì)象。在成員初始化表中包含對(duì)子對(duì)象的初始化和對(duì)類中其他成員的初始化。下面舉一例子說明成員初始化的構(gòu)造。第36頁/共50頁#include<iostream.h>
classA
{
private:
intA1,A2;
public:
A(inti,intj){A1=i;A2=j;}
voidprint(){cout<<A1<<“,”<<A2<<endl;}
};
classB
{
private:
Aa;//對(duì)象成員
intb;
public:
B(inti,intj,intk):a(i,j),b(k)
{
}
voidprint();
};voidB::print()
{
a.print();
cout<<b<<endl;
}
voidmain()
{
Bb(6,7,8);
b.print();
}該程序的輸出結(jié)果為:
6,7
8第37頁/共50頁其中,a(i,j),b(k)是成員初始化表,它有二項(xiàng),前一項(xiàng)是給子對(duì)象a初始化,其格式如下:
<子對(duì)象名>(<參數(shù)表>)
后一項(xiàng)是給類B的數(shù)據(jù)成員b初始化。這一項(xiàng)也可以寫在構(gòu)造函數(shù)的函數(shù)體內(nèi),使用賦值表達(dá)式語句
b=k;
給類B的數(shù)據(jù)成員初始化。
第38頁/共50頁4、類的對(duì)象初始化拷貝構(gòu)造函數(shù)是C++中引入的一種新的構(gòu)造函數(shù)。定義一個(gè)拷貝構(gòu)造函數(shù)的方式是:類名(const類名&形式參數(shù))
{函數(shù)體}
由此可看出:(1)拷貝構(gòu)造函數(shù)的名稱與類的名稱相同,且它只有一個(gè)參數(shù),該參數(shù)就是對(duì)該類對(duì)象的引用。(2)拷貝構(gòu)造函數(shù)的功能是用于實(shí)現(xiàn)對(duì)象值的拷貝,通過將一個(gè)同類對(duì)象的值拷貝給一個(gè)新對(duì)象,來完成對(duì)新對(duì)象的初始化,即用一個(gè)對(duì)象去構(gòu)造另外一個(gè)對(duì)象。第39頁/共50頁在下述三種情況下,需要用拷貝初始化構(gòu)造函數(shù)來用一個(gè)對(duì)象初始化另一個(gè)對(duì)象。
1)明確表示由一個(gè)對(duì)象初始化另一個(gè)對(duì)象時(shí),如:TPointP2(P1);
2)當(dāng)對(duì)象作為函數(shù)實(shí)參傳遞給函數(shù)形參時(shí),如:上例P=f(N);
3)當(dāng)對(duì)象用為函數(shù)返回值時(shí)。如果類中沒有說明拷貝初始化構(gòu)造函數(shù),則編譯系統(tǒng)自動(dòng)生成一個(gè)具有上術(shù)形式的缺省拷貝初始化構(gòu)造函數(shù)。作為該類的公有成員。第40頁/共50頁實(shí)例Example是一個(gè)人員信息類。用普通構(gòu)造函數(shù)生成obj1,用拷貝構(gòu)造函數(shù)生成obj2。#include<windows.h>#include<iostream.h>classExample{private:char*name;intnum;public:example(inti,char*str)//構(gòu)造函數(shù)定義
{name=str;num=i;}第41頁/共50頁example(constExample&x)//拷貝構(gòu)造函數(shù)定義
{num=x.num;}voidlist()//定義顯示函數(shù)list{cout<<"\數(shù)據(jù)成員num的值="<<num<<endl<<endl;}};voidmain(){exampleobj1(215,“張立三”);//調(diào)用函數(shù)Example(inti,char*str)構(gòu)造obj1exampleobj2(obj1);//使用拷貝構(gòu)造函數(shù)構(gòu)造obj2obj2.list();//顯示obj2的值
……//其它程序部分
}第42頁/共50頁程序的執(zhí)行結(jié)果是:數(shù)據(jù)成員num的值=215數(shù)據(jù)成員num的值=215說明:(1)上例中在main函數(shù)中的語句Exampleobj2(obj1);在執(zhí)行時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用類Example的拷貝構(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江廣廈建設(shè)職業(yè)技術(shù)大學(xué)《中國城市建設(shè)史》2023-2024學(xué)年第二學(xué)期期末試卷
- 鄂爾多斯應(yīng)用技術(shù)學(xué)院《管理會(huì)計(jì)實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 炎黃職業(yè)技術(shù)學(xué)院《計(jì)算機(jī)繪圖及BM應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 煙臺(tái)職業(yè)學(xué)院《足球理論與實(shí)踐Ⅲ》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年吉林省建筑安全員《B證》考試題庫
- 浙江機(jī)電職業(yè)技術(shù)學(xué)院《BIM技術(shù)原理及其應(yīng)用》2023-2024學(xué)年第二學(xué)期期末試卷
- 貴州師范學(xué)院《微機(jī)原理與接口技術(shù)B》2023-2024學(xué)年第二學(xué)期期末試卷
- 2025年安徽省建筑安全員知識(shí)題庫附答案
- 四川三河職業(yè)學(xué)院《建筑與環(huán)境設(shè)計(jì)方法》2023-2024學(xué)年第二學(xué)期期末試卷
- 邢臺(tái)應(yīng)用技術(shù)職業(yè)學(xué)院《體育教學(xué)訓(xùn)練理論與方法實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 冀教版英語九年級(jí)Unit 5 單詞短語預(yù)習(xí)復(fù)習(xí)單
- 公司安全生產(chǎn)監(jiān)督管理辦法
- 鋼筋工工藝與實(shí)習(xí)(第二版)課件匯總?cè)珪娮咏贪竿暾嬲n件最全幻燈片(最新)課件電子教案幻燈片
- 煤礦從業(yè)人員考試題庫全答案(word版)
- 洞頂回填技術(shù)交底
- 最簡易的帕累托圖制作方法簡介PPT通用課件
- 城市軌道交通應(yīng)急處理課程標(biāo)準(zhǔn)
- 初二下分式混合計(jì)算練習(xí)1(附答案)
- (完整版)振幅調(diào)制與解調(diào)習(xí)題及其解答
- 抗震支架施工安裝合同
- JJG 657-2019 呼出氣體酒精含量檢測儀 檢定規(guī)程(高清版)
評(píng)論
0/150
提交評(píng)論