




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第7章類與對(duì)象C++語言程序設(shè)計(jì)教程第7章類與對(duì)象1整理ppt第7章類與對(duì)象1.掌握類的定義,會(huì)根據(jù)需求設(shè)計(jì)類;2.會(huì)根據(jù)類創(chuàng)建各種對(duì)象;3.掌握對(duì)象的各種成員的使用方法;4.會(huì)設(shè)計(jì)構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)來初始化對(duì)象;理解其調(diào)用過程與順序;5.理解淺拷貝與深拷貝的概念;6.掌握動(dòng)態(tài)對(duì)象以及動(dòng)態(tài)對(duì)象數(shù)組的建立與釋放。7.理解類的靜態(tài)成員的概念;8.理解友元函數(shù)與友元類的概念;9.掌握常對(duì)象與常成員的使用;10.了解對(duì)象在內(nèi)存中的分布情況。學(xué)習(xí)目標(biāo)
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象2整理ppt7.1類與對(duì)象
在面向過程的結(jié)構(gòu)化程序設(shè)計(jì)中,程序模塊是由函數(shù)構(gòu)成,函數(shù)將對(duì)數(shù)據(jù)處理的語句放在函數(shù)體內(nèi),完成特定的功能,數(shù)據(jù)則通過函數(shù)參數(shù)傳遞進(jìn)入函數(shù)體。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,程序模塊是由類構(gòu)成的。類是對(duì)邏輯上相關(guān)的函數(shù)與數(shù)據(jù)的封裝,它是對(duì)問題的抽象描述。面向?qū)ο蟮某绦蛟O(shè)計(jì)方法就是運(yùn)用面向?qū)ο蟮挠^點(diǎn)來對(duì)現(xiàn)實(shí)世界中的各種問題進(jìn)行抽象,然后用計(jì)算機(jī)程序來描述并解決該問題,這種描述和處理是通過類與對(duì)象實(shí)現(xiàn)的。
類與對(duì)象是C++程序設(shè)計(jì)中最重要的概念
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象3整理ppt
每一個(gè)實(shí)體都是對(duì)象,每個(gè)對(duì)象都屬于一個(gè)特定的類型。在C++中對(duì)象的類型稱為類(class)。類代表了某一批對(duì)象的共性和特征。類是對(duì)象的抽象,而對(duì)象是類的具體實(shí)例(instance)。正如同結(jié)構(gòu)體類型和結(jié)構(gòu)體變量的關(guān)系一樣,人們先聲明一個(gè)結(jié)構(gòu)體類型,然后用它去定義結(jié)構(gòu)體變量。同一個(gè)結(jié)構(gòu)體類型可以定義出多個(gè)不同的結(jié)構(gòu)體變量。4整理ppt結(jié)構(gòu)體類型:
structStudent{intnum;charname[20];charsex;};Studentstud1,stud2;類:classStudent{intnum;charname[20];charsex;voiddisplay(){cout<<″num:″<<num<<endl;cout<<″name:″<<name<<endl;cout<<″sex:″<<sex<<endl;}};Studentstud1,stud25整理ppt【例7-1】模擬時(shí)鐘
分析:不管什么樣的時(shí)鐘,也不管各種時(shí)鐘是如何運(yùn)行的,它都具有時(shí)、分、秒3個(gè)屬性。除了運(yùn)行、顯示時(shí)間的基本功能外,還有設(shè)置(調(diào)整)時(shí)間、設(shè)置鬧鐘等功能。將時(shí)鐘的這些屬性與功能抽象出來,分別給出面向過程的程序與面向?qū)ο蟮某绦騺韺?shí)現(xiàn)對(duì)時(shí)鐘的模擬。
思考:二者有何不同?C++語言程序設(shè)計(jì)教程第7章類與對(duì)象6整理ppt******************************p7_1_b.cpp**面向?qū)ο蟮臅r(shí)鐘程序*******************************/#include<iostream>usingnamespacestd;classClock{private:intH,M,S;public:
voidSetTime(inth,intm,ints){H=(h>=0&&h<24)?h:0;M=(m>=0&&m<60)?m:0;S=(s>=0&&s<60)?s:0;}
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl;}};voidmain(void){ClockMyClock;MyClock.ShowTime();MyClock.SetTime(8,30,30);MyClock.ShowTime();}/******************************p7_1_a.cpp**面向過程的時(shí)鐘程序*******************************/#include<iostream>usingnamespacestd;structClock{intH,M,S;};ClockMyClock;voidSetTime(intH,intM,intS){MyClock.H=(H>=0&&H<24)?H:0;MyClock.M=(M>=0&&M<60)?M:0;MyClock.S=(S>=0&&S<60)?S:0;}voidShowTime(){cout<<MyClock.H<<":";cout<<MyClock.M<<":";cout<<MyClock.S<<endl;}voidmain(void){ShowTime(); SetTime(8,30,30);ShowTime();}123456789101112131415161718192021222324252627時(shí)鐘程序B時(shí)鐘程序A運(yùn)行結(jié)果:0:0:0-85893460:-85893460:-58934608:30:308:30:30
程序解釋:通過對(duì)上述兩種方案的程序進(jìn)行簡單的觀察,可以發(fā)現(xiàn)它們存在下面幾點(diǎn)不同:在程序A中,時(shí)鐘數(shù)據(jù)用一個(gè)結(jié)構(gòu)型的變量存儲(chǔ),對(duì)時(shí)鐘數(shù)據(jù)的存取通過函數(shù)實(shí)現(xiàn)。由于存儲(chǔ)時(shí)鐘數(shù)據(jù)的是一個(gè)全局變量,在任何地方都可見,可以不通過函數(shù)單獨(dú)存取時(shí)鐘數(shù)據(jù)。程序B中,只能通過類提供的函數(shù)操作時(shí)鐘。程序A中,數(shù)據(jù)與對(duì)數(shù)據(jù)操作相互獨(dú)立,數(shù)據(jù)作為參數(shù)傳遞給函數(shù)。程序B中,數(shù)據(jù)與對(duì)數(shù)據(jù)的操作構(gòu)成一個(gè)整體。程序A與程序B運(yùn)行的初始結(jié)果不同。這是因?yàn)樵诔绦駻中,變量是全局的;在程序B中,對(duì)象(變量)MyClock是函數(shù)main()中的局部對(duì)象。全局變量與局部變量在沒有初始化時(shí),取初值方式不同,這樣造成了運(yùn)行結(jié)果不同。將第23行移出main()外,使之變成全局對(duì)象后,兩程序結(jié)果完全相同。在程序B中發(fā)現(xiàn),一個(gè)以class開頭的類似結(jié)構(gòu)體的結(jié)構(gòu),將時(shí)鐘的數(shù)據(jù)與對(duì)數(shù)據(jù)進(jìn)行處理的函數(shù)包括在一起,這就是用C++實(shí)現(xiàn)的類。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7整理ppt7.1.2類的定義
class類名
{
public:
公有數(shù)據(jù)成員或公有函數(shù)成員的定義;
protected:
保護(hù)數(shù)據(jù)成員或保護(hù)函數(shù)成員的定義;
private:
私有數(shù)據(jù)成員或私有函數(shù)成員的定義;};說明:
關(guān)鍵字class表明定義的是一個(gè)類;類名是類的名稱,應(yīng)是一個(gè)合法的標(biāo)識(shí)符;
public、protected、private為存取控制屬性(訪問權(quán)限),用來控制對(duì)類的成員的存取。如果前面沒有標(biāo)明訪問權(quán)限,默認(rèn)訪問權(quán)限為private。類的成員有數(shù)據(jù)成員與函數(shù)成員兩類,類的數(shù)據(jù)成員和函數(shù)成員統(tǒng)稱為類的成員,類的數(shù)據(jù)成員一般用來描述該類對(duì)象的屬性,稱為屬性;函數(shù)成員是描述類行為,稱作方法。函數(shù)成員由函數(shù)構(gòu)成,這些作為類成員的函數(shù)因此也叫成員函數(shù)。
簡單講,類是一個(gè)包含函數(shù)的結(jié)構(gòu)體。因此,類的定義與結(jié)構(gòu)類型的定義相似,其格式如下:
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象8整理ppt7.1.2類的定義
例如:例7-1中定義了一個(gè)時(shí)鐘類Clock。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象9整理ppt
在C++中也是先聲明一個(gè)類類型,然后用它去定義若干個(gè)同類型的對(duì)象。對(duì)象就是類類型的一個(gè)變量??梢哉f類是對(duì)象的模板,是用來定義對(duì)象的一種抽象類型。類是抽象的,不占用內(nèi)存,而對(duì)象是具體的,占用存儲(chǔ)空間。在一開始時(shí)弄清對(duì)象和類的關(guān)系是十分重要的。類是用戶自己指定的類型。如果程序中要用到類類型,必須自己根據(jù)需要進(jìn)行聲明,或者使用別人已設(shè)計(jì)好的類。C++標(biāo)準(zhǔn)本身并不提供現(xiàn)成的類的名稱、結(jié)構(gòu)和內(nèi)容。在C++中聲明一個(gè)類類型和聲明一個(gè)結(jié)構(gòu)體類型是相似的。10整理ppt1.數(shù)據(jù)成員
類定義中的數(shù)據(jù)成員描述了類對(duì)象所包含的數(shù)據(jù)類型,數(shù)據(jù)成員的類型可以是C++基本數(shù)據(jù)類型,也可以是構(gòu)造數(shù)據(jù)類型。structRecord{ charname[20];intscore;};classTeam{private:intnum;//基本數(shù)據(jù)類型
Record*p;//構(gòu)造數(shù)據(jù)類型};C++語言程序設(shè)計(jì)教程第7章類與對(duì)象11整理pptclassTeam;//已定義的類classGrade{ Teama;//使用了已定義的類類型
Grade*p;//使用正在定義的類類型定義指針成員
Grade&r;//使用正在定義的類類型定義引用成員
Gradeb;//錯(cuò)誤!
使用了未定義完的類Record定義變量};注意:
因?yàn)轭愔皇且环N類型,類中的數(shù)據(jù)成員不占內(nèi)存空間,因此在定義數(shù)據(jù)成員時(shí)不能給數(shù)據(jù)成員賦初值。類的數(shù)據(jù)成員除了可以使用前面講述的C++類型外,還可以使用已定義完整的類類型。在正在定義的類中,由于該類型沒有定義完整,所以不能定義該類類型的變量,只能定義該類類型的指針成員以及該類類型的引用成員。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象12整理ppt2.成員函數(shù)
作為類成員的成員函數(shù)描述了對(duì)類中的數(shù)據(jù)成員實(shí)施的操作。成員函數(shù)的定義、聲明格式與非成員函數(shù)(全局函數(shù))的格式相同。成員函數(shù)可以放在類中定義,也可以放在類外。放在類中定義的成員函數(shù)為內(nèi)聯(lián)(inline)函數(shù)。
Clock類中的成員函數(shù)就是放在類內(nèi)定義的。
C++可以在類內(nèi)聲明成員函數(shù)的原型,在類外定義函數(shù)體。這樣做的好處是相當(dāng)于在類內(nèi)列了一個(gè)函數(shù)功能表,使我們對(duì)類的成員函數(shù)的功能一目了然,避免了在各個(gè)函數(shù)實(shí)現(xiàn)的大堆代碼中查找函數(shù)的定義。在類中聲明函數(shù)原型的方法與一般函數(shù)原型的聲明一樣,在類外定義函數(shù)體的格式如下:
::是類的作用域分辨符,用在此處,放在類名后成員函數(shù)前,表明后面的成員函數(shù)屬于前面的那個(gè)類。返回值類型類名::成員函數(shù)名(形參表){
函數(shù)體;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象13整理pptClock類中的成員函數(shù)可以在類中聲明:classClock{private:intH,M,S;public:voidSetTime(inth,intm,ints);//聲明成員函數(shù)
voidShowTime();//聲明成員函數(shù)
};
在類外實(shí)現(xiàn)成員函數(shù)如下:voidClock::SetTime(inth,intm,ints) { H=h,M=m,S=s; };voidClock::ShowTime() {cout<<H<<":"<<M<<":"<<S<<endl;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象14整理ppt
如果要將類外定義的成員函數(shù)編譯成內(nèi)聯(lián)函數(shù),可以在類外定義函數(shù)時(shí),函數(shù)的返回類型前加上inline;下面將ShowTime()定義成內(nèi)聯(lián)函數(shù),與在類內(nèi)定義成員函數(shù)的效果相同。inlinevoidClock::ShowTime(){cout<<H<<":"<<M<<":"<<S<<endl;}3.類作用域類是一組數(shù)據(jù)成員和函數(shù)成員的集合,類作用域作用于類中定義的特定的成員,包括數(shù)據(jù)成員與成員函數(shù),類內(nèi)的每一個(gè)成員都具有類作用域。實(shí)際上,類的封裝作用也就是限制類的成員其訪問范圍局限于類的作用域之內(nèi)。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象15整理pptclassClock{private:intH,M,S;public:
ClockAddTime(ClockC2){//形參為Clock類型的變量
ClockT;//函數(shù)體中定義了Clock類型的變量
...returnT;//返回類型為Clock類型
}};C++語言程序設(shè)計(jì)教程第7章類與對(duì)象注意:
在成員函數(shù)中不僅可以自由使用類的成員,還可以使用該類定義變量(對(duì)象),通過變量使用成員。其原因是函數(shù)在調(diào)用時(shí)才在棧內(nèi)存中建立函數(shù)體中的變量(包括實(shí)參),這時(shí)類已經(jīng)定義完畢,當(dāng)然可以使用已定義完整的類類型的變量。16整理ppt7.1.3對(duì)象的建立與使用
類相當(dāng)于一種包含函數(shù)的自定義數(shù)據(jù)類型,它不占內(nèi)存,是一個(gè)抽象的“虛”體,使用已定義的類建立對(duì)象就像用數(shù)據(jù)類型定義變量一樣。對(duì)象建立后,對(duì)象占據(jù)內(nèi)存,變成了一個(gè)“實(shí)”體。類與對(duì)象的關(guān)系就像數(shù)據(jù)類型與變量的關(guān)系一樣。其實(shí),一個(gè)變量就是一個(gè)簡單的不含成員函數(shù)的數(shù)據(jù)對(duì)象。類名對(duì)象名;
建立對(duì)象的格式如下:其中,對(duì)象名可以是簡單的標(biāo)識(shí)符,也可以是數(shù)組。在例7-1中,使用:
ClockMyClock;
建立了一個(gè)Clock型的對(duì)象MyClock。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象類名對(duì)象名;17整理ppt
在建立對(duì)象后,就可以通過對(duì)象存取對(duì)象中的數(shù)據(jù)成員,調(diào)用成員函數(shù)。存取語法如下:例如,通過對(duì)象MyClock使用成員函數(shù)SetTime()的方式如下:MyClock.SetTime(8,30,30);
至于對(duì)數(shù)據(jù)成員H、M、S的存取,因其存取權(quán)限為pravate而被保護(hù),所以不能進(jìn)行直接存取。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象
對(duì)象名.屬性對(duì)象名.成員函數(shù)名(實(shí)參1,實(shí)參2,…,)注意:為節(jié)省內(nèi)存,編譯器在創(chuàng)建對(duì)象時(shí),只為各對(duì)象分配用于保存各對(duì)象數(shù)據(jù)成員初始化的值,并不為各對(duì)象的成員函數(shù)分配單獨(dú)的內(nèi)存空間,而是共享類的成員函數(shù)定義,即類中成員函數(shù)的定義為該類的所有對(duì)象所共享,這是C++編譯器創(chuàng)建對(duì)象的一種方法,在實(shí)際應(yīng)用中,我們?nèi)砸獙?duì)象理解為由數(shù)據(jù)成員和函數(shù)成員兩部分組成。18整理ppt7.1.4成員的存取控制
通過設(shè)置成員的存取控制屬性,使對(duì)類成員的存取得到控制,從而達(dá)到了信息隱藏的目的。C++的存取控制屬性有:公有類型(public)、私有類型(private)和保護(hù)類型(protected)。三者的意義如下:表7-1存取控制屬性表
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象存取屬性意義可存取對(duì)象public公開(公有)級(jí)該類成員以及所有對(duì)象protected保護(hù)級(jí)該類及其子類成員private私有級(jí)該類的成員
類中定義為public等級(jí)的成員,可以被該類的任何對(duì)象存取,適用于完全公開的數(shù)據(jù)。而private等級(jí)的成員只可被類內(nèi)的成員存取,適用于不公開的數(shù)據(jù)。至于protected等級(jí),屬于半公開性質(zhì)的數(shù)據(jù),定義為protected等級(jí)的成員,可以被該類及其子類存取。關(guān)于子類的概念,在以后的章節(jié)中講述。19整理ppt
在Clock類中,H、M、S的存取控制屬性為privated。這樣,這些數(shù)據(jù)不能在類外存取而被保護(hù),下列存取方法是錯(cuò)誤的:MyClock.M=30;
而成員函數(shù)SetTime()、ShowTime()存取控制屬性為public,因此在類外可以通過對(duì)象存取。 由于private成員被隱藏起來,不能直接在類外被存取,為了取得這些被隱藏的數(shù)據(jù),通常在類內(nèi)定義一個(gè)public的成員函數(shù),通過該成員函數(shù)存取private成員,而public的成員函數(shù)又能在類外被調(diào)用。這樣通過調(diào)用public型的成員函數(shù),間接存取到private成員。這樣的函數(shù)起到了為private成員提供供外界訪問的接口作用。類Clock中成員函數(shù)SetTime()、ShowTime()就是存取private數(shù)據(jù)成員H、M、S的接口。通過接口訪問類的數(shù)據(jù)成員,一方面有效保護(hù)數(shù)據(jù)成員,另一方面又保證了數(shù)據(jù)的合理性。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象20整理ppt7.2構(gòu)造函數(shù)與析構(gòu)函數(shù)
在定義一個(gè)對(duì)象的同時(shí),希望能給它的數(shù)據(jù)成員賦初值――對(duì)象的初始化。在特定對(duì)象使用結(jié)束時(shí),還經(jīng)常需要進(jìn)行一些清理工作。C++程序中的初始化和清理工作分別由兩個(gè)特殊的成員函數(shù)來完成,它們就是構(gòu)造函數(shù)和析構(gòu)函數(shù)。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象21整理ppt7.2.1構(gòu)造函數(shù)構(gòu)造函數(shù)(constructor)
構(gòu)造函數(shù)是與類名相同的,在建立對(duì)象時(shí)自動(dòng)調(diào)用的函數(shù)。如果在定義類時(shí),沒有為類定義構(gòu)造函數(shù),編譯系統(tǒng)就生成一個(gè)默認(rèn)形式的隱含的的構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)的函數(shù)體是空的,因此默認(rèn)構(gòu)造函數(shù)不具備任何功能。如果用戶至少為類定義了一個(gè)構(gòu)造函數(shù),C++就不會(huì)生成任何默認(rèn)的構(gòu)造函數(shù),而是根據(jù)對(duì)象的參數(shù)類型和個(gè)數(shù)從用戶定義的構(gòu)造函數(shù)中選擇最合適的構(gòu)造函數(shù)完成對(duì)該對(duì)象的初始化。作為類的成員函數(shù),構(gòu)造函數(shù)可以直接訪問類的所有數(shù)據(jù)成員,可以是內(nèi)聯(lián)函數(shù),可以不帶任何參數(shù),可以帶有參數(shù)表以及默認(rèn)形參值,還可以重載,用戶可以根據(jù)不同問題的具體需要,有針對(duì)性地設(shè)計(jì)合適的構(gòu)造函數(shù)將對(duì)象初始化為特定的狀態(tài)。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象22整理ppt例如,將例7-1程序p7-1_b.cpp中的Clock類中添加帶有默認(rèn)形參值的構(gòu)造函數(shù):
Clock(inth=0,intm=0,ints=0){H=(h>=0&&h<24)?h:0;M=(m>=0&&m<60)?m:0;S=(s>=0&&s<60)?s:0;}執(zhí)行:ClockMyClock;MyClock.ShowTime();
顯示結(jié)果為:
0:0:0
這是因?yàn)榻?duì)象時(shí)調(diào)用了Clock(),各個(gè)形參被設(shè)成了默認(rèn)值。當(dāng)執(zhí)行:
ClockMyClock(9,30,45);MyClock.ShowTime();顯示結(jié)果為:
9:30:45這是因?yàn)榻?duì)象時(shí)調(diào)用了Clock(9,30,45)C++語言程序設(shè)計(jì)教程第7章類與對(duì)象23整理ppt
構(gòu)造函數(shù)是類的一個(gè)成員函數(shù),除了具有一般成員函數(shù)的特征之外,還歸納出如下特殊的性質(zhì):構(gòu)造函數(shù)的函數(shù)名必須與定義它的類同名。構(gòu)造函數(shù)沒有返回值。如果在構(gòu)造函數(shù)前加void是錯(cuò)誤的。構(gòu)造函數(shù)被聲明定義為公有函數(shù)。構(gòu)造函數(shù)在建立對(duì)象時(shí)由系統(tǒng)自動(dòng)調(diào)用。
注意:由于構(gòu)造函數(shù)可以重載,可以定義多個(gè)構(gòu)造函數(shù),在建立對(duì)象時(shí)根據(jù)參數(shù)來調(diào)用相應(yīng)的構(gòu)造函數(shù)。如果相應(yīng)的構(gòu)造函數(shù)沒有定義,則出錯(cuò)。例如,若定義例7-1中的構(gòu)造函數(shù),而不是帶默認(rèn)形參值的構(gòu)造函數(shù):
Clock(inth,intm,ints){H=(h>=0&&h<24)?h:0;M=(m>=0&&m<60)?m:0;S=(s>=0&&s<60)?s:0;}
定義對(duì)象ClockMyClock;時(shí),調(diào)用Clock(),而Clock類沒有Clock()函數(shù),因而出錯(cuò)。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象24整理ppt7.2.2析構(gòu)函數(shù)
自然界萬物都是有生有滅,程序中的對(duì)象也是一樣。對(duì)象在定義時(shí)誕生,不同生存期的對(duì)象在不同的時(shí)期消失。在對(duì)象要消失時(shí),通常有一些善后工作需要做,例如:構(gòu)造對(duì)象時(shí),通過構(gòu)造函數(shù)動(dòng)態(tài)申請了一些內(nèi)存單元,在對(duì)象消失之前就要釋放這些內(nèi)存單元。C++用什么來保證這些善后清除工作的執(zhí)行呢?答案是:析構(gòu)函數(shù)。
析構(gòu)函數(shù)(destructor)也譯作拆構(gòu)函數(shù),是在對(duì)象消失之前的瞬間自動(dòng)調(diào)用的函數(shù),其形式是:構(gòu)造函數(shù)名(類名)前加上一個(gè)邏輯非運(yùn)算符~,以示與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)與構(gòu)造函數(shù)的作用幾乎正好相反,相當(dāng)于“逆構(gòu)造函數(shù)”。析構(gòu)函數(shù)也是類的一個(gè)特殊的公有函數(shù)成員,
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象~構(gòu)造函數(shù)名();25整理ppt7.2.2析構(gòu)函數(shù)析構(gòu)函數(shù)具有以下特點(diǎn):析構(gòu)函數(shù)沒有任何參數(shù),不能被重載,但可以是虛函數(shù),一個(gè)類只有一個(gè)析構(gòu)函數(shù)。析構(gòu)函數(shù)沒有返回值。析構(gòu)函數(shù)名與類名相同,但在類名前加上一個(gè)邏輯非運(yùn)算符“~”,以示與構(gòu)造函數(shù)對(duì)比區(qū)別。析構(gòu)函數(shù)一般由用戶自己定義,在對(duì)象消失時(shí)由系統(tǒng)自動(dòng)調(diào)用,如果用戶沒有定義析構(gòu)函數(shù),系統(tǒng)將自動(dòng)生成一個(gè)不做任何事的默認(rèn)析構(gòu)函數(shù)。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象注意:在對(duì)象消失時(shí)的清理工作并不是由析構(gòu)函數(shù)完成,而是靠用戶在析構(gòu)函數(shù)中添加清理語句完成。
26整理ppt123456789101112131415/******************************p7_2.cpp**構(gòu)造函數(shù)與析構(gòu)函數(shù)******************************/#include<iostream>usingnamespacestd;classClock
{private:intH,M,S;public:
Clock(inth=0,intm=0,ints=0){ H=h,M=m,S=s; cout<<"constructor:"<<H<<":"<<M<<":"<<S<<endl;}
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象27整理ppt161718192021222324252627
~Clock(){ cout<<"destructor:"<<H<<":"<<M<<":"<<S<<endl;}};ClockC1(8,0,0);ClockC2(9,0,0);voidmain(void){
ClockC3(10,0,0);
ClockC4(11,0,0);}運(yùn)行結(jié)果:constructor:8:0:0constructor:9:0:0constructor:10:0:0constructor:11:0:0destructor:11:0:0destructor:10:0:0C++語言程序設(shè)計(jì)教程第7章類與對(duì)象28整理ppt1234567891011121314151617181920/***********************************p7_3.cpp**基本的字符串類***********************************/#include<iostream>usingnamespacestd;classString
{private:char*Str; intlen; public:
voidShowStr(){ cout<<"string:"<<Str<<",length:"<<len<<endl;}
String(){ len=0; Str=NULL;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象29整理ppt21222324252627282930313233343536373839404142
String(constchar*p){ len=strlen(p); Str=newchar[len+1]; strcpy(Str,p);}
~String(){ if(Str!=NULL) { delete[]Str; Str=NULL; }}};voidmain(void){chars[]="ABCDE"; Strings1(s); Strings2("123456"); s1.ShowStr(); s2.ShowStr();}運(yùn)行結(jié)果:string:ABCDE,length:5string:123456,length:6C++語言程序設(shè)計(jì)教程第7章類與對(duì)象30整理ppt7.2.3拷貝構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)是與類名相同,形參是本類的對(duì)象的引用的函數(shù),在用已存在對(duì)象初始化新建立對(duì)象時(shí)調(diào)用。類的拷貝構(gòu)造函數(shù)一般由用戶定義,如果用戶沒有定義拷貝構(gòu)造函數(shù),系統(tǒng)就會(huì)自動(dòng)生成一個(gè)默認(rèn)函數(shù),這個(gè)默認(rèn)拷貝構(gòu)造函數(shù)的功能是把初始值對(duì)象的每個(gè)數(shù)據(jù)成員的值依次復(fù)制到新建立的對(duì)象中。因此,也可以說是完成了同類對(duì)象的克隆(Clone)。這樣得到的對(duì)象和原對(duì)象具有完全相同的數(shù)據(jù)成員,即完全相同的屬性。
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象31整理ppt
用戶可以也可以根據(jù)實(shí)際問題的需要定義特定的拷貝構(gòu)造函數(shù)來改變?nèi)笔】截悩?gòu)造函數(shù)的行為,以實(shí)現(xiàn)同類對(duì)象之間數(shù)據(jù)成員的傳遞。如果用戶自定義了拷貝構(gòu)造函數(shù),則在用一個(gè)類的對(duì)象初始化該類的另外一個(gè)對(duì)象時(shí),自動(dòng)調(diào)用自定義的拷貝構(gòu)造函數(shù)。定義一個(gè)拷貝構(gòu)造函數(shù)的一般形式為:
拷貝構(gòu)造函數(shù)在用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí)調(diào)用,以下三種情況相當(dāng)于用一個(gè)已存在的對(duì)象去初始化新建立的對(duì)象,此時(shí),調(diào)用拷貝構(gòu)造函數(shù):
①當(dāng)用類的一個(gè)對(duì)象去初始化該類的另一個(gè)對(duì)象時(shí)。
②如果函數(shù)的形參是類的對(duì)象,調(diào)用函數(shù)時(shí),將對(duì)象作為函數(shù)實(shí)參傳遞給函數(shù)的形參時(shí)。
③如果函數(shù)的返回值是類的對(duì)象,函數(shù)執(zhí)行完成,將返回值返回時(shí)。類名(類名&
對(duì)象名){…};C++語言程序設(shè)計(jì)教程第7章類與對(duì)象32整理ppt12345678910111213141516171819/******************************p7_4.cpp**構(gòu)造拷貝構(gòu)造函數(shù)******************************/#include<iostream>usingnamespacestd;classClock{private:intH,M,S;public:
Clock(inth=0,intm=0,ints=0){ H=h,M=m,S=s; cout<<"constructor:"<<H<<":"<<M<<":"<<S<<endl;}
~Clock(){ cout<<"destructor:"<<H<<":"<<M<<":"<<S<<endl;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象33整理ppt20212223242526272829303132333435363738394041424344
Clock(Clock&p){cout<<"copyconstructor,beforecall:"<<H<<":"<<M<<":"<<S<<endl;H=p.H;M=p.M;S=p.S;}
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl;}};
Clockfun(ClockC){returnC;}voidmain(void){ClockC1(8,0,0);ClockC2(9,0,0);ClockC3(C1);fun(C2);ClockC4;C4=C2;}
運(yùn)行結(jié)果:constructor:8:0:0constructor:9:0:0copyconstructor,beforecall:-858993460:-858993460:-858993460copyconstructor,beforecall:1310592:4200534:1310568copyconstructor,beforecall:-858993460:-858993460:-858993460destructor:9:0:0destructor:9:0:0constructor:0:0:0destructor:9:0:0destructor:8:0:0destructor:9:0:0destructor:8:0:0注意:拷貝構(gòu)造函數(shù)只是在用一個(gè)已存在的對(duì)象去初始化新建立的對(duì)象時(shí)調(diào)用,在對(duì)象進(jìn)行賦值時(shí),拷貝構(gòu)造函數(shù)不被調(diào)用。用一個(gè)常量初始化新建立的對(duì)象時(shí),調(diào)用構(gòu)造函數(shù),不調(diào)用拷貝構(gòu)造函數(shù)。建立對(duì)象時(shí),構(gòu)造函數(shù)與拷貝構(gòu)造函數(shù)有且僅有一個(gè)被調(diào)用。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象34整理ppt7.2.4淺拷貝與深拷貝
在默認(rèn)的拷貝構(gòu)造函數(shù)中,拷貝的策略是直接將原對(duì)象的數(shù)據(jù)成員值依次拷貝給新對(duì)象中對(duì)應(yīng)的數(shù)據(jù)成員,如前面示例p7_4.cpp中定義的拷貝函數(shù)所示,那么我們?yōu)楹尾恢苯邮褂孟到y(tǒng)默認(rèn)的拷貝構(gòu)造函數(shù),何必又自己定義一個(gè)拷貝構(gòu)造函數(shù)呢?但是,有些情況下使用默認(rèn)的拷貝構(gòu)造函數(shù)卻會(huì)出現(xiàn)意想不到的問題。
例如,使用程序p7_3.cpp中定義的String類,執(zhí)行下列程序系統(tǒng)就會(huì)出錯(cuò):
voidmain(){Strings1("123456");Strings2=s1;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象35整理ppt
為什么會(huì)出錯(cuò)呢?程序中首先創(chuàng)建對(duì)象s1,為對(duì)象s1分配相應(yīng)的內(nèi)存資源,調(diào)用構(gòu)造函數(shù)初始化該對(duì)象,然后調(diào)用系統(tǒng)缺省的拷貝構(gòu)造函數(shù)將對(duì)象s1拷貝給對(duì)象s2,這一切看來似乎很正常,但程序的運(yùn)行卻出現(xiàn)異常!原因在于默認(rèn)的拷貝構(gòu)造函數(shù)實(shí)現(xiàn)的只能是淺拷貝,即直接將原對(duì)象的數(shù)據(jù)成員值依次拷貝給新對(duì)象中對(duì)應(yīng)的數(shù)據(jù)成員,并沒有為新對(duì)象另外分配內(nèi)存資源。這樣,如果對(duì)象的數(shù)據(jù)成員是指針,兩個(gè)指針對(duì)象實(shí)際上指向的是同一塊內(nèi)存空間。
當(dāng)執(zhí)行Strings2=s1時(shí),默認(rèn)的淺拷貝構(gòu)造函數(shù)進(jìn)行的是下列操作:
s2.len=s1.len;s2.Str=s1.Str;
實(shí)際上是將s1.Str的地址賦給了s2.Str,并沒有為s2.Str分配內(nèi)存,執(zhí)行Strings2=s1;后,對(duì)象s2析構(gòu),釋放內(nèi)存,然后對(duì)象s1析構(gòu),由于s1.Str和s2.Str所占用的是同一塊內(nèi)存,而同一塊內(nèi)存不可能釋放兩次,所以當(dāng)對(duì)象s1析構(gòu)時(shí),程序出現(xiàn)異常,無法正常執(zhí)行和結(jié)束。由此可見,在某些情況下,淺拷貝會(huì)帶來數(shù)據(jù)安全方面的隱患。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象36整理ppt
當(dāng)類的數(shù)據(jù)成員中有指針類型時(shí),我們就必須定義一個(gè)特定的拷貝構(gòu)造函數(shù),該拷貝構(gòu)造函數(shù)不僅可以實(shí)現(xiàn)原對(duì)象和新對(duì)象之間數(shù)據(jù)成員的拷貝,而且可以為新的對(duì)象分配單獨(dú)的內(nèi)存資源,這就是深拷貝構(gòu)造函數(shù)。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象37整理ppt【例7-5】帶深拷貝構(gòu)造函數(shù)的字符串類。在程序p7_3中的String類中,加入下列拷貝構(gòu)造函數(shù),構(gòu)成了帶深拷貝函數(shù)的字符串類。String(String&r){ len=r.len; if(len!=0) {
Str=newchar[len+1];strcpy(Str,r.Str);
}}下列程序能正常運(yùn)行。voidmain(void){
Strings1("123456"); Strings2=s1; s1.ShowStr(); s2.ShowStr();}C++語言程序設(shè)計(jì)教程第7章構(gòu)造數(shù)據(jù)類型注意:在重新定義拷貝構(gòu)造函數(shù)后,默認(rèn)拷貝構(gòu)造函數(shù)與默認(rèn)構(gòu)造函數(shù)就不存在了,如果在此時(shí)調(diào)用默認(rèn)構(gòu)造函數(shù)就會(huì)出錯(cuò)。在重新定義構(gòu)造函數(shù)后,默認(rèn)構(gòu)造函數(shù)就不存在了,但默認(rèn)拷貝構(gòu)造函數(shù)還存在。在對(duì)象進(jìn)行賦值時(shí),拷貝構(gòu)造函數(shù)不被調(diào)用。此時(shí)進(jìn)行的是結(jié)構(gòu)式的拷貝。38整理ppt
類相當(dāng)于一種包含函數(shù)的自定義數(shù)據(jù)類型,它不占內(nèi)存,是一個(gè)抽象的“虛”體,使用已定義的類建立對(duì)象就像用數(shù)據(jù)類型定義變量一樣。對(duì)象建立后,對(duì)象占據(jù)內(nèi)存,變成了一個(gè)“實(shí)”體。對(duì)象如同一般變量,占用一塊連續(xù)的內(nèi)存區(qū)域,因此可以使用一個(gè)指向?qū)ο蟮闹羔榿碓L問對(duì)象,即對(duì)象指針,它指向存放該對(duì)象的地址??捎妙悂矶x對(duì)象指針變量,通過對(duì)象指針來訪問對(duì)象的成員。
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7.3對(duì)象的使用39整理ppt7.3.1對(duì)象指針
對(duì)象指針遵循一般變量指針的各種規(guī)則,其語法定義形式如下:如同通過對(duì)象名訪問對(duì)象的成員一樣,使用對(duì)象指針也只能訪問該類的公有數(shù)據(jù)成員和函數(shù)成員,但與前者使用“.”運(yùn)算符不同,對(duì)象指針采用“->”運(yùn)算符訪問公有數(shù)對(duì)象指針名->數(shù)據(jù)成員名例如:
Clock
*Cp;ClockC1(8,0,0);Clock*Cp;Cp=&C1;Cp->ShowTime();C++語言程序設(shè)計(jì)教程第7章類與對(duì)象
類名*對(duì)象指針名;
對(duì)象指針名->數(shù)據(jù)成員名或:對(duì)象指針名->成員函數(shù)名(參數(shù)表)40整理ppt
在C++中,對(duì)象指針可以作為成員函數(shù)的形參,一般而言,使用對(duì)象指針作為函數(shù)的參數(shù)要比使用對(duì)象作為函數(shù)的參數(shù)更普遍一些,因?yàn)槭褂脤?duì)象指針作為函數(shù)的參數(shù)有如下兩點(diǎn)好處:(1)實(shí)現(xiàn)地址傳遞。通過在函數(shù)調(diào)用時(shí)將實(shí)參對(duì)象的地址傳遞給形參指針對(duì)象,使形參指針對(duì)象和實(shí)參對(duì)象指向同一內(nèi)存地址,這樣,對(duì)象指針?biāo)赶驅(qū)ο蟮母淖円矊⑼瑯佑绊懼鴮?shí)參對(duì)象,從而實(shí)現(xiàn)信息的雙向傳遞。(2)
使用對(duì)象指針效率高使用對(duì)象指針傳遞的僅僅是對(duì)應(yīng)實(shí)參對(duì)象的地址,并不需要實(shí)現(xiàn)對(duì)象之間的副本拷貝,這樣就會(huì)減小時(shí)空開銷,提高運(yùn)行效率。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象41整理ppt123456789101112131415161718/******************************p7_6.cpp**帶時(shí)間加法的時(shí)鐘類******************************/#include<iostream>usingnamespacestd;classClock{private:intH,M,S;public:
voidSetTime(inth,intm,ints){ H=h,M=m,S=s;}
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象【例7-6】時(shí)間加法。時(shí)間加法有兩種,一種是時(shí)鐘加秒數(shù),另一種是時(shí)鐘加時(shí)、分、秒。采用重載函數(shù)實(shí)現(xiàn)這兩種加法。42整理ppt192021222324252627282930313233343536
Clock(inth=0,intm=0,ints=0){ H=h,M=m,S=s;}
Clock(Clock&p){ H=p.H,M=p.M,S=p.S;}voidTimeAdd(Clock*Cp);voidTimeAdd(inth,intm,ints);voidTimeAdd(ints);};voidClock::TimeAdd(Clock
*Cp){H=(Cp->H+H+(Cp->M+M+(Cp->S+S)/60)/60)%24;M=(Cp->M+M+(Cp->S+S)/60)%60;S=(Cp->S+S)%60;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象函數(shù)重載函數(shù)原型聲明對(duì)象指針43整理ppt373839404142434445464748495051525354555657voidClock::TimeAdd(inth,intm,ints){H=(h+H+(m+M+(s+S)/60)/60)%24;M=(m+M+(s+S)/60)%60;S=(s+S)%60; }voidClock::TimeAdd(ints){H=(H+(M+(S+s)/60)/60)%24;M=(M+(S+s)/60)%60;S=(S+s)%60;}voidmain(){ClockC1;ClockC2(8,20,20);C1.TimeAdd(4000);C1.ShowTime();C2.TimeAdd(&C1);C2.ShowTime();}運(yùn)行結(jié)果:1:6:409:27:0
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象函數(shù)重載函數(shù)重載44整理ppt7.3.2對(duì)象引用
對(duì)象引用就是對(duì)某類對(duì)象定義一個(gè)引用,其實(shí)質(zhì)是通過將被引用對(duì)象的地址賦給引用對(duì)象,使二者指向同一內(nèi)存空間,這樣引用對(duì)象就成為了被引用對(duì)象的“別名”。對(duì)象引用的定義方法與基本數(shù)據(jù)類型變量引用的定義是一樣的。定義一個(gè)對(duì)象引用,并同時(shí)指向一個(gè)對(duì)象的格式為:
類名&對(duì)象引用名=被引用對(duì)象;
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象注意:對(duì)象引用與被引用對(duì)象必須是同類型的。除非是作為函數(shù)參數(shù)與函數(shù)返回值,對(duì)象引用在定義時(shí)必須要初始化。定義一個(gè)對(duì)象引用并沒有定義一個(gè)對(duì)象,所以不分配任何內(nèi)存空間,不調(diào)用構(gòu)造函數(shù)。45整理ppt對(duì)象引用的使用格式為:
例如:
ClockC1(8,20,20);Clock&Cr=C1;//定義了C1的對(duì)象引用Cr。
Cr.ShowTime();//通過對(duì)象引用使用對(duì)象的成員運(yùn)行結(jié)果為:
8:20:20C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7.3.2對(duì)象引用
對(duì)象引用名.
數(shù)據(jù)成員名或:對(duì)象引用名.
成員函數(shù)名(參數(shù)表)46整理ppt對(duì)象引用的優(yōu)點(diǎn):對(duì)象引用通常用作函數(shù)的參數(shù),它不僅具有對(duì)象指針的優(yōu)點(diǎn),而且比對(duì)象指針更簡潔,更方便,更直觀。將p7_6.cpp中添加如下函數(shù):
voidClock::TimeAdd(Clock&Cr){ H=(Cr.H+H+(Cr.M+M+(Cr.S+S)/60)/60)%24; M=(Cr.M+M+(Cr.S+S)/60)%60;S=(Cr.S+S)%60;}
將C2.TimeAdd(&C1);替換為:C2.TimeAdd(C1);
運(yùn)行結(jié)果與p7_6.cpp一樣。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7.3.2對(duì)象引用47整理ppt
對(duì)象數(shù)組是以對(duì)象為元素的數(shù)組。對(duì)象數(shù)組的定義、賦值、引用與普通數(shù)組一樣,只是數(shù)組元素與普通數(shù)組的數(shù)組元素不同。對(duì)象數(shù)組定義格式如下:
其中,類名指出該數(shù)組元素所屬的類,常量表達(dá)式給出某一維元素的個(gè)數(shù)。
與結(jié)構(gòu)數(shù)組不同,對(duì)象數(shù)組初始化需要使用構(gòu)造函數(shù)完成,以一個(gè)大小為n的一維數(shù)組為例,對(duì)象數(shù)組的初始化格式如下:C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7.3.3對(duì)象數(shù)組類名對(duì)象數(shù)組名[常量表達(dá)式n],...,[常量表達(dá)式2][常量表達(dá)式1];數(shù)組名[n]={構(gòu)造函數(shù)(數(shù)據(jù)成員1初值,數(shù)據(jù)成員2初值,…),構(gòu)造函數(shù)(數(shù)據(jù)成員1初值,數(shù)據(jù)成員2初值,…),…構(gòu)造函數(shù)(數(shù)據(jù)成員1初值,數(shù)據(jù)成員2初值,…)};注意:不帶初始化表的對(duì)象數(shù)組,其初始化靠調(diào)用不帶參數(shù)的構(gòu)造函數(shù)完成。
48整理ppt
以一個(gè)m維數(shù)組為例,對(duì)象數(shù)組元素的存取格式如下:
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象
對(duì)象數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]…[下標(biāo)表達(dá)式m].數(shù)據(jù)成員名或:對(duì)象數(shù)組名[下標(biāo)表達(dá)式1][下標(biāo)表達(dá)式2]…[下標(biāo)表達(dá)式m].成員函數(shù)名(參數(shù)表)【例7-7】計(jì)算一個(gè)班學(xué)生某門功課的總評(píng)成績。分析:首先設(shè)計(jì)一個(gè)類Score,這個(gè)類的數(shù)據(jù)成員為一個(gè)學(xué)生的學(xué)號(hào)、姓名、平時(shí)成績、期末考試成績,成員函數(shù)有求總評(píng)成績、顯示成績。然后,定義一個(gè)對(duì)象數(shù)組存儲(chǔ)一個(gè)班學(xué)生的成績。最后,通過逐一調(diào)用數(shù)組元素的成員函數(shù)求每個(gè)學(xué)生的總評(píng)成績。49整理ppt123456789101112131415161718192021/******************************************p7_7.cpp**求一個(gè)班學(xué)生某門功課的總評(píng)成績*******************************************/#include<iostream>usingnamespacestd;constintMaxN=100;constdoubleRate=0.6;//平時(shí)成績比例classScore{private: longNo;//學(xué)號(hào)
char*Name;//姓名
intPeace;//平時(shí)成績
intFinal;//期末考試成績
intTotal;//總評(píng)成績
public:Score(long=0,char*=NULL,int=0,int=0,int=0);//構(gòu)造函數(shù)
voidCount();//計(jì)算總評(píng)成績
voidShowScore();//顯示成績};C++語言程序設(shè)計(jì)教程第7章類與對(duì)象50整理ppt22232425262728293031323334353637Score::Score(longno,char*name,intpeace,intfinal,inttotal)//構(gòu)造函數(shù){No=no;Name=name;Peace=peace;Final=final;Total=total;}voidScore::Count(){Total=Peace*Rate+Final*(1-Rate)+0.5;}voidScore::ShowScore(){cout<<No<<"\t"<<Name<<"\t"<<Peace<<"\t"<<Final<<"\t"<<Total<<endl;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象51整理ppt38394041424344454647484950voidmain(){ScoreClassScore1[3];ScoreClassScore2[3]={Score(200607001,"Tom",80,79), Score(200607002,"John",90,85),Score(200607003,"Wilson",70,55)};for(inti=0;i<3;i++)ClassScore2[i].Count();for(i=0;i<3;i++)ClassScore2[i].ShowScore();}運(yùn)行結(jié)果:200607001Tom807980200607002John908588200607003Wilson705564C++語言程序設(shè)計(jì)教程第7章類與對(duì)象對(duì)象數(shù)組52整理ppt7.3.4動(dòng)態(tài)對(duì)象動(dòng)態(tài)對(duì)象:動(dòng)態(tài)對(duì)象是指編程者隨時(shí)動(dòng)態(tài)建立并可隨時(shí)消失的對(duì)象。建立動(dòng)態(tài)對(duì)象采用動(dòng)態(tài)申請內(nèi)存的語句new,刪除動(dòng)態(tài)對(duì)象使用delete語句。建立一個(gè)動(dòng)態(tài)對(duì)象的格式為:
對(duì)象指針=new類名(初值表);
C++語言程序設(shè)計(jì)教程第7章類與對(duì)象注意:對(duì)象指針的類型應(yīng)與類名一致。動(dòng)態(tài)對(duì)象存儲(chǔ)在new語句從堆申請的空間中。建立動(dòng)態(tài)對(duì)象時(shí)要調(diào)用構(gòu)造函數(shù),當(dāng)初值表缺省時(shí)調(diào)用默認(rèn)的構(gòu)造函數(shù)。53整理ppt例如:
Clock*Cp;//建立對(duì)象指針
Cp=newClock;//建立動(dòng)態(tài)對(duì)象,調(diào)用默認(rèn)構(gòu)造函數(shù)Clock()。
Cp->ShowTime();//結(jié)果為0:0:0Cp=newClock(8,0,0);//建立動(dòng)態(tài)對(duì)象,調(diào)用構(gòu)造函數(shù)Clock(int,int,int)
Cp->ShowTime();//結(jié)果為8:0:0C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7.3.4動(dòng)態(tài)對(duì)象注意:
函數(shù)體內(nèi)的局部對(duì)象在函數(shù)調(diào)用時(shí)建立,在函數(shù)調(diào)用完后消失;全局對(duì)象則在程序執(zhí)行時(shí)建立,執(zhí)行完成后才消失;這些對(duì)象在何時(shí)建立,何時(shí)消失是C++規(guī)定好了的,不是編程者能控制的。54整理ppt
在堆中建立的動(dòng)態(tài)對(duì)象不能自動(dòng)消失,需要使用delete語句刪除對(duì)象,格式為:在刪除動(dòng)態(tài)對(duì)象時(shí),釋放堆中的內(nèi)存空間,在對(duì)象消失時(shí),調(diào)用析構(gòu)函數(shù)。例如:
deleteCp;//刪除Cp指向的動(dòng)態(tài)對(duì)象
動(dòng)態(tài)對(duì)象的一個(gè)重要的使用方面是用動(dòng)態(tài)對(duì)象組成動(dòng)態(tài)對(duì)象數(shù)組,建立一個(gè)一維動(dòng)態(tài)對(duì)象數(shù)組的格式為:
刪除一個(gè)動(dòng)態(tài)對(duì)象數(shù)組的格式為:在建立動(dòng)態(tài)對(duì)象數(shù)組時(shí),要調(diào)用構(gòu)造函數(shù),調(diào)用的次數(shù)與數(shù)組的大小相同;刪除對(duì)象數(shù)組時(shí),要調(diào)用析構(gòu)函數(shù),調(diào)用次數(shù)與數(shù)組的大小相同。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象delete對(duì)象指針;
對(duì)象指針=new
類名[數(shù)組大小];delete[]
對(duì)象指針;55整理ppt將p7_7.cpp改為用動(dòng)態(tài)對(duì)象數(shù)組實(shí)現(xiàn)如下:C++語言程序設(shè)計(jì)教程第7章類與對(duì)象7.3.4動(dòng)態(tài)對(duì)象
Score::SetScore(longno,char*name,intpeace,intfinal,inttotal){No=no;Name=name;Peace=peace;Final=final;Total=total;}56整理ppt將p7_7.cpp改為用動(dòng)態(tài)對(duì)象數(shù)組實(shí)現(xiàn)如下:C++語言程序設(shè)計(jì)教程第7章類與對(duì)象SetScore()函數(shù)為動(dòng)態(tài)數(shù)組設(shè)置初值。voidmain(){Score*ClassScore;ClassScore=newScore[3];ClassScore[0].SetScore(200607001,"Tom",80,79),ClassScore[1].SetScore(200607002,"John",90,85),ClassScore[2].SetScore(200607003,"Wilson",70,55);for(inti=0;i<3;i++)ClassScore[i].Count();for(i=0;i<3;i++)ClassScore[i].ShowScore();delete[]ClassScore;}57整理ppt7.3.5This指針
一個(gè)類的成員函數(shù)中,有時(shí)希望引用調(diào)用的它對(duì)象,對(duì)此,C++采用隱含的this指針來實(shí)現(xiàn)。
this指針是一個(gè)系統(tǒng)預(yù)定義的特殊指針,指向當(dāng)前對(duì)象,表示當(dāng)前對(duì)象的地址。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象123456例如:voidClock::SetTime(inth,intm,ints){H=h,M=m,S=s;this->H=h,this->M=m,this->S=s;(*this).H=h,(*this).M=m,(*this).S=s;}//語句3、4、5是等效的為了與類的數(shù)據(jù)成員H、M、S區(qū)別,將SetTime的形參名設(shè)為h、m、s。如果使用this指針,就可以憑this指針區(qū)分本對(duì)象的數(shù)據(jù)成員與其他變量。58整理ppt
系統(tǒng)利用this指針明確指出成員函數(shù)當(dāng)前操作的數(shù)據(jù)成員所屬的對(duì)象。實(shí)際上,當(dāng)一個(gè)對(duì)象調(diào)用其成員函數(shù)時(shí),編譯器先將該對(duì)象的地址賦給this指針,然后調(diào)用成員函數(shù),這樣成員函數(shù)對(duì)對(duì)象的數(shù)據(jù)成員進(jìn)行操作時(shí),就隱含使用了this指針。一般而言,通常不直接使用this指針來引用對(duì)象成員,但在某些少數(shù)情況下,可以使用this指針,如:重載某些運(yùn)算符以實(shí)現(xiàn)對(duì)象的連續(xù)賦值等。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象1234//使用this指針重新設(shè)計(jì)的SetTime()成員函數(shù)如下:
voidClock::SetTime(intH,intM,intS){this->H=H,this->M=M,this->S=S;}注意:this指針不是調(diào)用對(duì)象的名稱,而是指向調(diào)用對(duì)象的指針的名稱。this的值不能改變,它總是指向當(dāng)前調(diào)用對(duì)象。59整理ppt7.3.6對(duì)象組合
組合概念體現(xiàn)的是一種包含與被包含的關(guān)系,在語義上表現(xiàn)為“ispartof”的關(guān)系,即在邏輯上A是B的一部分。在C++程序設(shè)計(jì)中,類的組合用來描述一類復(fù)雜的對(duì)象,在類的定義中,它的某些屬性,往往是另一個(gè)類的對(duì)象,而不是像整型、浮點(diǎn)型之類的簡單數(shù)據(jù)類型,也就是“一個(gè)類內(nèi)嵌其它類的對(duì)象作為成員”,將對(duì)象嵌入到類中的這樣一種描述復(fù)雜類的方法,我們稱之為“類的組合”,一個(gè)含有其他類對(duì)象的類稱為組合類,組合類的對(duì)象稱為組合對(duì)象。組合類定義的步驟為:先定義成員類,再定義組合類。C++語言程序設(shè)計(jì)教程第7章類與對(duì)象60整理ppt7.3.6對(duì)象組合【例7-8】計(jì)算某次火車的旅途時(shí)間。分析:某次火車有車次、起點(diǎn)站、終點(diǎn)站、出發(fā)時(shí)間、到達(dá)時(shí)間。前面定義的Clock類正具有時(shí)間特性,因此,可以利用Clock對(duì)象組合成一個(gè)火車旅途類TrainTrip。假定火車均為24小時(shí)內(nèi)到達(dá),旅途時(shí)間為到達(dá)時(shí)間減出發(fā)時(shí)間。用空方框表示類,灰框表示對(duì)象,組合類可以表示為空框包含灰框。設(shè)計(jì)TrainTrip類的示意圖與成員構(gòu)成圖如圖7-4:C++語言程序設(shè)計(jì)教程第7章類與對(duì)象61整理ppt1234567891011121314151617181920/******************************p7_8.cpp**計(jì)算火車旅途時(shí)間的組合類******************************/#include<iostream>usingnamespacestd;classClock{private:intH,M,S;public:
voidShowTime(){cout<<H<<":"<<M<<":"<<S<<endl;}
voidSetTime(intH=0,intM=0,intS=0){this->H=H,this->M=M,this->S=S;}
Clock(intH=0,intM=0,intS=0){this->H=H,this->M=M,this->S=S;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象Clock類62整理ppt232425262728293031323334353637383940intGetH(){returnH; }intGetM(){returnM; }intGetS(){returnS; }};classTrainTrip{private:char*TrainNo;//車次
ClockStartTime;//出發(fā)時(shí)間
ClockEndTime;//到達(dá)時(shí)間public:
TrainTrip(char*TrainNo,ClockS,ClockE){this->TrainNo=TrainNo;StartTime=S; EndTime=E;}C++語言程序設(shè)計(jì)教程第7章類與對(duì)象組合類63整理ppt4142434445464748495051525354555657585960
ClockTripTime(){inttH,tM,tS;//臨時(shí)存儲(chǔ)小時(shí)、分、秒數(shù)
intcarry=0;//借位
ClocktTime;//臨時(shí)存儲(chǔ)時(shí)間
(tS=EndTime.GetS()-StartTime.GetS())>0?carry=0:tS+=60,carry=1;(tM=EndTime.GetM()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- T/GXSXFS 004-2020豬用菌酶協(xié)同發(fā)酵濃縮飼料
- 應(yīng)聘java實(shí)習(xí)生面試題及答案
- 大連飛創(chuàng)java面試題及答案
- 我國有限責(zé)任公司股東失權(quán)制度研究
- 2025校園安全考試題庫及答案
- T/GDMIA 013-2024滾壓滾珠絲杠副檢驗(yàn)驗(yàn)收
- 2025順豐安全考試題庫及答案
- 滑坡災(zāi)害GNSS監(jiān)測多路徑誤差處理與失穩(wěn)時(shí)間預(yù)測研究
- 戲曲題材紀(jì)錄片《薪火相傳》創(chuàng)作闡述
- 城商銀行ZJ分行零售客戶經(jīng)理績效考核優(yōu)化研究
- 倍智tas人才測評(píng)系統(tǒng)題庫及答案
- 2023年新高考(新課標(biāo))全國2卷數(shù)學(xué)試題真題(含答案解析)
- DB63-T 164-2021草地地面鼠害防治技術(shù)規(guī)范
- 抖音生活服務(wù)服務(wù)商合作手冊-抖音
- 涉密人員保密審查表
- Unit2Lesson3GettingToTheTop課件-高中英語北師大版(2019)選擇性必修第一冊
- 卡通風(fēng)青春畢業(yè)季PPT模板課件
- 《804泄爆墻安裝施工方案》
- 環(huán)境及理化因素?fù)p傷救護(hù)
- 大氣污染控制工程課程設(shè)計(jì)---電除塵器設(shè)計(jì)說明書
- 上泰pH計(jì)SUNTEX-PC-3110操作說明書
評(píng)論
0/150
提交評(píng)論