2018數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)描述模塊_第1頁(yè)
2018數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)描述模塊_第2頁(yè)
2018數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)描述模塊_第3頁(yè)
2018數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)描述模塊_第4頁(yè)
2018數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)描述模塊_第5頁(yè)
已閱讀5頁(yè),還剩75頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

模塊三C++類(lèi)及其對(duì)象的封裝性C++面向?qū)ο蟪绦蛟O(shè)計(jì)本模塊主要內(nèi)容2類(lèi)的聲明和對(duì)象定義類(lèi)的成員函數(shù)對(duì)象成員的引用構(gòu)造函數(shù)和析構(gòu)函數(shù)對(duì)象指針動(dòng)態(tài)存儲(chǔ)類(lèi)的聲明和對(duì)象定義3C++類(lèi)及其對(duì)象的封裝性類(lèi)是具有相同屬性和行為的一組對(duì)象的集合,它為屬于該類(lèi)的全部對(duì)象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個(gè)主要部分。利用類(lèi)可以實(shí)現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類(lèi)易于編寫(xiě)大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。類(lèi)的聲明和對(duì)象定義4C++類(lèi)及其對(duì)象的封裝性類(lèi)是對(duì)象共性特征的抽象,對(duì)象的類(lèi)型稱(chēng)為類(lèi),類(lèi)是對(duì)象的模板,對(duì)象是類(lèi)的具體實(shí)例;先聲明一個(gè)類(lèi),再定義對(duì)象,類(lèi)是抽象的,不占用內(nèi)存,對(duì)象是具體的,占用實(shí)際的存儲(chǔ)空間;可以看作是一種特殊的構(gòu)造數(shù)據(jù)類(lèi)型,是結(jié)構(gòu)體的擴(kuò)充形式;類(lèi)是數(shù)據(jù)和對(duì)這些數(shù)據(jù)進(jìn)行操作的函數(shù)的封裝體,是包括數(shù)據(jù)和函數(shù)的數(shù)據(jù)類(lèi)型;類(lèi)的定義包括數(shù)據(jù)和函數(shù)的定義,類(lèi)中的數(shù)據(jù)和函數(shù)都是類(lèi)的成員;在C++中,類(lèi)用class來(lái)構(gòu)造。類(lèi)的聲明//聲明結(jié)構(gòu)體類(lèi)型

struct

Student{int

num;char

name[20]

;char

sex;};//定義2個(gè)結(jié)構(gòu)變量Student

stud1,stud2class

Student

//聲明類(lèi),以class開(kāi)頭{int

num;char

name[20]

;char

sex;

//以上3行是數(shù)據(jù)成員void

display()

//成員函數(shù){cout<<“num:”<<num<<endl;cout<<“name

:”

<<name<<endlcout<<“sex:”<<sex<<endl;

}};//定義Student類(lèi)的對(duì)象stud1,stud2;5Student

stud1,stud2;6類(lèi)的聲明和對(duì)象定義上述類(lèi)定義中未限定成員的訪(fǎng)問(wèn)屬性,對(duì)象stud1的數(shù)據(jù)和函數(shù)都是private的,數(shù)據(jù)安全了。但外界不能調(diào)用stud1中的函數(shù)和功能,因?yàn)闆](méi)有提供類(lèi)的對(duì)外的接口,類(lèi)有何用?不能把類(lèi)中的全部成員與外界隔離,一般將類(lèi)中的數(shù)據(jù)隱藏起來(lái),聲明為私有的(

private

),把成員函數(shù)作為對(duì)外界的接口,聲明為公有的(public)。例如,上述類(lèi)聲明改為:class

Student

//聲明類(lèi)類(lèi)型{private:

//聲明以下部分為私有

int

num;char

name[20]

;char

sex;public:

//聲明以下部分為公有

void

display(){cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;

}};Student

stud1,stud2;7在C++中,定義類(lèi)的一般格式為:class

類(lèi)名{private://私有類(lèi)型只限于通過(guò)自己的成員函數(shù)//來(lái)訪(fǎng)問(wèn),即只有類(lèi)本身能夠訪(fǎng)問(wèn)它數(shù)據(jù)成員和成員函數(shù)說(shuō)明public://公有類(lèi)型提供了類(lèi)的外部接口,允許類(lèi)//的使用者來(lái)訪(fǎng)問(wèn)它數(shù)據(jù)成員和成員函數(shù)說(shuō)明protected://保護(hù)類(lèi)型只允許本類(lèi)成員函數(shù)或派生//類(lèi)成員函數(shù)訪(fǎng)問(wèn),用于類(lèi)的繼承和派生數(shù)據(jù)成員和成員函數(shù)};公有類(lèi)型成員8在關(guān)鍵字public后面聲明,它們是類(lèi)與外部的接口,任何外部函數(shù)都可以訪(fǎng)問(wèn)公有類(lèi)型數(shù)據(jù)和函數(shù)。類(lèi)的聲明和對(duì)象的定義私有類(lèi)型成員9在關(guān)鍵字private后面聲明,只允許本類(lèi)中的函數(shù)訪(fǎng)問(wèn),而類(lèi)外部的任何函數(shù)都不能訪(fǎng)問(wèn)。如果緊跟在類(lèi)名稱(chēng)的后面聲明私有成員,則關(guān)鍵字private可以省略。類(lèi)的聲明和對(duì)象的定義保護(hù)類(lèi)型10與private類(lèi)似,其差別表現(xiàn)在繼承與派生時(shí)對(duì)派生類(lèi)的影響不同。類(lèi)的聲明和對(duì)象的定義在類(lèi)的定義中應(yīng)注意以下幾點(diǎn):111、“類(lèi)名”是一個(gè)合法的標(biāo)識(shí)符;2、關(guān)鍵字private,public和protected說(shuō)明類(lèi)成員的三種訪(fǎng)問(wèn)權(quán)限;3、{}以?xún)?nèi)的部分是“類(lèi)內(nèi)”,{}以外的部分為“類(lèi)外”;4、類(lèi)定義的聲明部分在“類(lèi)內(nèi)”,類(lèi)的成員函數(shù)既可以在“類(lèi)內(nèi)”定義,也可以在“類(lèi)外”定義;5、在“類(lèi)內(nèi)”不允許對(duì)所聲明的數(shù)據(jù)成員進(jìn)行初始化,類(lèi)的數(shù)據(jù)成員的類(lèi)型可以任意。12//聲明一個(gè)類(lèi)class

CArea{private://私有部分int

x,

y,

area;public:

//公有部分void

squarea(int

vx,

int

vy);};例題3.

1數(shù)據(jù)成員13與一般的變量聲明相同,但需要將它放在類(lèi)的聲明體中。類(lèi)的聲明和對(duì)象的定義成員函數(shù)14在類(lèi)中說(shuō)明原形,可以在類(lèi)外給出函數(shù)體實(shí)現(xiàn),并在函數(shù)名前使用類(lèi)名加以限定。也可以直接在類(lèi)中給出函數(shù)體,形成內(nèi)置成員函數(shù)。允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)。類(lèi)的聲明和對(duì)象的定義類(lèi)的成員class

Clock{public:void

SetTime(int

NewH,

int

NewM,int

NewS);void

ShowTime();private:int

Hour,

Minute,

Second;};成員數(shù)據(jù)成員函數(shù)15類(lèi)的聲明和對(duì)象的定義void

Clock

::

SetTime(int

NewH,

int

NewM,int

NewS){Hour=NewH;Minute=NewM;Second=NewS;}void

Clock

::

ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}16類(lèi)的聲明和對(duì)象的定義類(lèi)和結(jié)構(gòu)體的異同1、均為構(gòu)造類(lèi)型;2、結(jié)構(gòu)體用struct、類(lèi)用class作為標(biāo)識(shí);2、結(jié)構(gòu)體中的成員只有數(shù)據(jù)成員,且訪(fǎng)問(wèn)權(quán)限默認(rèn)為public的;3、類(lèi)的成員包括數(shù)據(jù)和函數(shù),且訪(fǎng)問(wèn)權(quán)限可以設(shè)置為private、public和protected的;4、結(jié)構(gòu)沒(méi)有實(shí)現(xiàn)數(shù)據(jù)封裝,數(shù)據(jù)可以被任何外部函數(shù)訪(fǎng)問(wèn)。類(lèi)實(shí)現(xiàn)了數(shù)據(jù)封裝,可以將數(shù)據(jù)限定為只能被本身的成員函數(shù)訪(fǎng)問(wèn)。17類(lèi)的聲明和對(duì)象的定義18定義對(duì)象的方法1、先聲明類(lèi)類(lèi)型,然后再定義對(duì)象:如

Student

stud1,stud2;在聲明類(lèi)類(lèi)型之后,定義對(duì)象有2種方法:class

類(lèi)名對(duì)象名;如

class

Student

stud1,stud2;類(lèi)名對(duì)象名;如

Student

stud1,stud2;類(lèi)的聲明和對(duì)象的定義定義對(duì)象的方法2、在聲明類(lèi)類(lèi)型的同時(shí)定義對(duì)象://聲明類(lèi)類(lèi)型//先聲明公用部分class

Student{

public:void

display(){

cout<<“num:”<<num<<endl;cout<<“name:”<<name<<endl;cout<<“sex:”<<sex<<endl;

}private:

//后聲明私有部分

intnum;char

name[20]

;char

sex;}stud1,stud2;//定義Student類(lèi)的對(duì)象stud1,stud192類(lèi)的聲明和對(duì)象的定義20定義對(duì)象的方法3、不出現(xiàn)類(lèi)名,直接定義對(duì)象://聲明類(lèi)類(lèi)型//聲明公用部分//聲明私有部分//聲明保護(hù)部分class{

public:……private:……protected:……}stud1,stud2;//定義對(duì)象stud1,stud2定義多個(gè)對(duì)象時(shí),對(duì)象名之間用逗號(hào)隔開(kāi);對(duì)象名可以是一般的對(duì)象、指向?qū)ο蟮闹羔樆蛞妹部梢允菍?duì)象數(shù)組。類(lèi)的聲明和對(duì)象的定義例3.221定義一個(gè)日期類(lèi)CDate,再創(chuàng)建一個(gè)生日對(duì)象。class

CDate{int

year;int

month;int

day;public:voidSetDate(int,int,int);void

ShowDate();}myBirthday;

//同時(shí)創(chuàng)建對(duì)象myBirthday或者定義類(lèi)之后:CDate

myBirthday,*p,q[5];類(lèi)的聲明和對(duì)象的定義類(lèi)的成員函數(shù)C++類(lèi)及其對(duì)象的封裝性類(lèi)的成員函數(shù)具有一般函數(shù)的性質(zhì),它同時(shí)屬于某個(gè)類(lèi)的成員,出現(xiàn)在類(lèi)定義體中,可被限定為具有

private、public和protected三種訪(fǎng)問(wèn)屬性;成員函數(shù)可以訪(fǎng)問(wèn)本類(lèi)中的任何成員(包括private和public特性),可以引用在本作用域中有效的數(shù)據(jù);private屬性的成員函數(shù)只能被本類(lèi)其它的成員函數(shù)調(diào)用,不能被外界調(diào)用;public屬性的成員函數(shù)可以被外界調(diào)用,它是類(lèi)的對(duì)外接口。22在類(lèi)外定義成員函數(shù)23類(lèi)的成員函數(shù)類(lèi)的成員函數(shù)可以在“類(lèi)內(nèi)”聲明,在“類(lèi)外”定義;類(lèi)外定義成員函數(shù)的一般形式如下:

返回值類(lèi)型

類(lèi)名::成員函數(shù)名(參數(shù)表){

……

//函數(shù)體}其中::是作用域運(yùn)算符。例3.324//公用成員函數(shù)原型聲明//以上3行是私有數(shù)據(jù)成員class

Student

{public:void

display(

);private:intnum;string

name;charsex;};void

Student

::display()

//在類(lèi)外定義成員函數(shù){ cout<<“num:”<<

num

<<

endl;cout

<<“name:”<<

name

<<

endl;cout

<<“sex:”<<

sex

<<

endl;

}Student

stud1,stud2;

//定義2個(gè)類(lèi)對(duì)象類(lèi)的成員函數(shù)25內(nèi)置(inline)成員函數(shù)有些簡(jiǎn)單的成員函數(shù)可以直接在類(lèi)定義中定義,在類(lèi)定義體中定義的成員函數(shù)稱(chēng)為內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù));內(nèi)置函數(shù)可以減少函數(shù)調(diào)用時(shí)的內(nèi)存開(kāi)銷(xiāo),不用記錄函數(shù)調(diào)用返回地址,只將代碼嵌入到函數(shù)調(diào)用點(diǎn)內(nèi)置函數(shù)的定義有兩種方法:1、隱式定義將成員函數(shù)的定義體放在“類(lèi)內(nèi)”中。2、顯式定義在“類(lèi)內(nèi)”聲明,在“類(lèi)外”定義時(shí)在函數(shù)名前加關(guān)鍵字inline。類(lèi)的成員函數(shù)內(nèi)置成員函數(shù)舉例(一)26class

Point{public:void

Init(int

initX,int

initY){X=initX;Y=initY;}int

GetX()

{return

X;}int

GetY()

{return

Y;}private:int

X,Y;};類(lèi)的成員函數(shù)內(nèi)置成員函數(shù)舉例(二)27class

Point{public:void

Init(int

initX,int

initY);int

GetX();int

GetY();private:int

X,Y;};類(lèi)的成員函數(shù)inline

void

Point::Init(int

initX,int

initY){X=initX;Y=initY;}inline

int

Point::GetX(){return

X;}inline

int

Point::GetY(){return

Y;}29成員函數(shù)的存儲(chǔ)方式定義類(lèi)對(duì)象時(shí),系統(tǒng)會(huì)為每個(gè)對(duì)象分配存儲(chǔ)空間,包括為類(lèi)對(duì)象的數(shù)據(jù)和函數(shù)代碼分配空間;如果定義同類(lèi)的10個(gè)對(duì)象,那么如何為這10個(gè)對(duì)象分配不同的空間?10

個(gè)同類(lèi)對(duì)象占用存儲(chǔ)單元的情況類(lèi)的成員函數(shù)30成員函數(shù)的存儲(chǔ)方式為了節(jié)約內(nèi)存,只用一段存儲(chǔ)空間來(lái)存放10個(gè)對(duì)象擁有的共同的函數(shù)代碼段,如下圖:10

個(gè)同類(lèi)對(duì)象成員函數(shù)的存儲(chǔ)方式C++規(guī)定:對(duì)象占用的存儲(chǔ)空間只是對(duì)象數(shù)據(jù)成員占用的存儲(chǔ)空間,可用sizeof函數(shù)驗(yàn)證;共同的成員函數(shù)代碼存儲(chǔ)在對(duì)象空間之外。類(lèi)的成員函數(shù)31成員函數(shù)的存儲(chǔ)方式調(diào)用不同對(duì)象的成員函數(shù)時(shí)都是執(zhí)行同一段函數(shù)代碼,但其執(zhí)行結(jié)果一般不同(常與數(shù)據(jù)有關(guān));不同對(duì)象使用同一段函數(shù)代碼,它們?nèi)绾螌?duì)不同對(duì)象中的數(shù)據(jù)進(jìn)行操作呢?C++專(zhuān)門(mén)為此設(shè)計(jì)了一個(gè)this指針,用來(lái)指向不同的對(duì)象;調(diào)用哪個(gè)對(duì)象,this就指向哪個(gè)對(duì)象,就訪(fǎng)問(wèn)它的成員。類(lèi)的成員函數(shù)類(lèi)中成員的訪(fǎng)問(wèn)方式32類(lèi)中成員互訪(fǎng)直接使用成員名類(lèi)外訪(fǎng)問(wèn)使用“對(duì)象名.成員名”方式訪(fǎng)問(wèn)public屬性的成員類(lèi)的成員函數(shù)例:類(lèi)的應(yīng)用舉例33#include<iostream>using

namespace

std;class

Clock{......//類(lèi)的聲明略}//......類(lèi)的實(shí)現(xiàn)略

void

main(void){

Clock

myClock;myClock.SetTime(8,30,30);myClock.ShowTime();}類(lèi)的成員函數(shù)對(duì)象成員的引用34訪(fǎng)問(wèn)對(duì)象中的成員有3種方法:1、通過(guò)對(duì)象名和成員運(yùn)算符訪(fǎng)問(wèn)對(duì)象中的成員,即:對(duì)象名.數(shù)據(jù)成員名or

對(duì)象名.成員函數(shù)名(參數(shù)表)例如:stud1.

num

=1001;stud1.

display();//設(shè)num和display函數(shù)為public成員類(lèi)的成員函數(shù)35對(duì)象成員的引用定義一個(gè)日期類(lèi),使其具有輸出當(dāng)前日期的功能。例gf4:引用對(duì)象的成員2、通過(guò)指向?qū)ο蟮闹羔樤L(fǎng)問(wèn)對(duì)象中的成員,即:對(duì)象指針->數(shù)據(jù)成員名or

對(duì)象指針->成員函數(shù)名(參數(shù)表)例如:Time

t,*p=&t;cout<<p->hour;//hour是t中的成員3、通過(guò)對(duì)象的引用變量訪(fǎng)問(wèn)對(duì)象中的成員。類(lèi)的成員函數(shù)構(gòu)造函數(shù)36構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說(shuō)將對(duì)象初始化為一個(gè)特定的狀態(tài)。在對(duì)象創(chuàng)建時(shí)由系統(tǒng)自動(dòng)調(diào)用。如果程序中未聲明,則系統(tǒng)自動(dòng)產(chǎn)生出一個(gè)默認(rèn)形式的構(gòu)造函數(shù)。允許為內(nèi)置函數(shù)、重載函數(shù)、帶默認(rèn)形參值的函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)37構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的名字必須與類(lèi)名相同;構(gòu)造函數(shù)一般聲明為public,無(wú)返回值,無(wú)需定義返回類(lèi)型;構(gòu)造函數(shù)是系統(tǒng)自動(dòng)調(diào)用的,且執(zhí)行一次;構(gòu)造函數(shù)不能被繼承,但允許重載(overloading);構(gòu)造函數(shù)的功能是對(duì)對(duì)象進(jìn)行初始化,一般構(gòu)造函數(shù)用于對(duì)象的初始化,每當(dāng)對(duì)象被聲明時(shí)對(duì)數(shù)據(jù)成員做初始化,不做賦值外的事情。構(gòu)造函數(shù)的幾種形式38構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)可為內(nèi)聯(lián)函數(shù),可以為無(wú)參數(shù)或帶參數(shù),還可以缺省參數(shù),例如:無(wú)參的構(gòu)造函數(shù)參數(shù)化的構(gòu)造函數(shù)缺省參數(shù)的構(gòu)造函數(shù)多構(gòu)造函數(shù)拷貝構(gòu)造函數(shù)class

CArea{public:CArea(

){x=0;

y=0;}

//無(wú)參數(shù)的構(gòu)造函數(shù)CArea

(int

rx,

int

ry=0);CArea(float

rr)

{rr=0;}//帶缺省參數(shù)的構(gòu)造函數(shù)//帶一個(gè)參數(shù)的構(gòu)造函數(shù)CArea(float

rr,char

*ra);

//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)};在類(lèi)中聲明的多種構(gòu)造函數(shù):例39構(gòu)造函數(shù)舉例40class

Clock{public:Clock

(int

NewH,int

NewM,int

NewS);//構(gòu)造函數(shù)

void

SetTime(int

NewH,int

NewM,int

NewS);void

ShowTime();private:int

Hour,Minute,Second;};構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的實(shí)現(xiàn):31Clock::Clock(int

NewH,

int

NewM,

int

NewS){Hour=

NewH;Minute=

NewM;Second=

NewS;}建立對(duì)象時(shí)構(gòu)造函數(shù)的作用:void

main(){Clock c

(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實(shí)參。

c.ShowTime();}例gf5

在類(lèi)中定義構(gòu)造函數(shù)。42構(gòu)造函數(shù)的使用何時(shí)調(diào)用構(gòu)造函數(shù)?在類(lèi)對(duì)象進(jìn)入其作用域時(shí)調(diào)用構(gòu)造函數(shù);構(gòu)造函數(shù)沒(méi)有返回值,不要在定義構(gòu)造函數(shù)時(shí)聲明類(lèi)型;構(gòu)造函數(shù)不需要用戶(hù)調(diào)用,也不能被用戶(hù)調(diào)用;在構(gòu)造函數(shù)體中,不僅可以對(duì)數(shù)據(jù)成員賦初值,還可以包含其他語(yǔ)句如cout;如果用戶(hù)沒(méi)有定義構(gòu)造函數(shù),C++系統(tǒng)會(huì)自動(dòng)生成一個(gè)構(gòu)造函數(shù),其函數(shù)體為空,不執(zhí)行初始化操作;要想初始化一個(gè)對(duì)象,需要重新定義構(gòu)造函數(shù),否則對(duì)象的狀態(tài)將是隨機(jī)的。構(gòu)造函數(shù)和析構(gòu)函數(shù)43帶參數(shù)的構(gòu)造函數(shù)定義對(duì)象時(shí),通過(guò)不同參數(shù)值的傳遞實(shí)現(xiàn)不同對(duì)象的不同初始化,可以使用帶參數(shù)的構(gòu)造函數(shù);一般格式:構(gòu)造函數(shù)名(類(lèi)型1

形參1,類(lèi)型2

形參2,……)用戶(hù)不能顯式地調(diào)用構(gòu)造函數(shù),也無(wú)法采用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參(如fun(a,b))。實(shí)參只能在定義對(duì)象時(shí)給出,定義對(duì)象的一般格式:類(lèi)名對(duì)象名(實(shí)參1,實(shí)參2,……);例gf6:有兩個(gè)長(zhǎng)方體,長(zhǎng)、寬、高分別為:(1)12,25,30;(2)15,30,21。用帶參數(shù)的構(gòu)造函數(shù)編寫(xiě)程序求其體積。構(gòu)造函數(shù)和析構(gòu)函數(shù)使用參數(shù)初始化表44在定義對(duì)象時(shí),可使用參數(shù)初始化表來(lái)實(shí)現(xiàn)對(duì)數(shù)據(jù)成員的初始化,在函數(shù)首部實(shí)現(xiàn):Box::Box(int

h,

int

w,

int

len):

height(h),

width(w),length(len)

{

}其含義是:用形參h的值初始化數(shù)據(jù)成員height,用形參w的值初始化數(shù)據(jù)成員width,用形參len的值初始化數(shù)據(jù)成員length。構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)的重載45一個(gè)類(lèi)可以定義多個(gè)構(gòu)造函數(shù),使用戶(hù)選用不同的方式完成對(duì)象數(shù)據(jù)的初始化;重載的所有構(gòu)造函數(shù)同名,但其參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)必須有所區(qū)別。構(gòu)造函數(shù)和析構(gòu)函數(shù)46重載構(gòu)造函數(shù)的例子例,可以在類(lèi)中聲明的多種構(gòu)造函數(shù):class

CArea{public:CArea(

){x=0;

y=0;}

//無(wú)參數(shù)的構(gòu)造函數(shù)CArea

(int

rx,

int

ry=0);

//帶缺省參數(shù)的構(gòu)造函數(shù)CArea(float

rr)

{rr=0;}

//帶一個(gè)參數(shù)的構(gòu)造函數(shù)

CArea(float

rr,char

*ra);

//帶兩個(gè)參數(shù)的構(gòu)造函數(shù)};例gf7

在例gf6的基礎(chǔ)上定義兩個(gè)構(gòu)造函數(shù),其中一個(gè)無(wú)參數(shù),一個(gè)有參數(shù)。缺省構(gòu)造函數(shù)47在調(diào)用構(gòu)造函數(shù)時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱(chēng)為默認(rèn)構(gòu)造函數(shù)(DefaultConstructor)或缺省構(gòu)造函數(shù);無(wú)參數(shù)的構(gòu)造函數(shù)屬于缺省構(gòu)造函數(shù);如果在定義對(duì)象時(shí)選用無(wú)參構(gòu)造函數(shù),應(yīng)按以下形式定義對(duì)象:Box

box1;//調(diào)用無(wú)參構(gòu)造函數(shù)建立對(duì)象在一個(gè)類(lèi)中可以包含多個(gè)構(gòu)造函數(shù),但是在創(chuàng)建每個(gè)對(duì)象時(shí),只執(zhí)行其中一個(gè)匹配版本的構(gòu)造函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)默認(rèn)形參值的作用48函數(shù)在聲明時(shí)可以預(yù)先給出默認(rèn)的形參值,調(diào)用時(shí)如給出實(shí)參,則采用實(shí)參值,否則采用預(yù)先給出的默認(rèn)形參值。例如:int

add(int

x=5,int

y=6){

return

x+y;}void

main(void){ add(10,20);

//10+20add(10);add(

);//10+6//5+6}默認(rèn)形參值的說(shuō)明次序49默認(rèn)形參值必須從右向左順序聲明,并且在默認(rèn)形參值的右面不能有非默認(rèn)形參值的參數(shù)。因?yàn)檎{(diào)用時(shí)實(shí)參取代形參是從左向右的順序。例:int

add(int

x,int

y=5,int

z=6);//正確

int

add(int

x=1,int

y=5,int

z);//錯(cuò)誤

int

add(int

x=1,int

y,int

z=6);//錯(cuò)誤默認(rèn)形參值與函數(shù)的調(diào)用位置調(diào)用出現(xiàn)在函數(shù)體實(shí)現(xiàn)之前時(shí),默認(rèn)形參值必

須在函數(shù)原形中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體

實(shí)現(xiàn)之后時(shí),默認(rèn)形參值需在函數(shù)實(shí)現(xiàn)時(shí)給出。例:int

add(int

x=5,int

y=6);void

main(void){

add();//調(diào)用在實(shí)現(xiàn)前}int

add(int

x,int

y){ return

x+y;

}int

add(int

x=5,int

y=6){

return

x+y;

}void

main(void){

add();

//調(diào)用在實(shí)現(xiàn)后}50默認(rèn)形參值的作用域51在相同的作用域內(nèi),默認(rèn)形參值的說(shuō)明應(yīng)保持唯一,但如果在不同的作用域內(nèi),允許說(shuō)明不同的默認(rèn)形參。例:int

add(int

x=1,int

y=2);void

main(void){ int

add(int

x=3,int

y=4);add();

//使用局部默認(rèn)形參值(實(shí)現(xiàn)3+4)}void

fun(void){

...add();

//使用全局默認(rèn)形參值(實(shí)現(xiàn)1+2)}使用默認(rèn)參數(shù)的構(gòu)造函數(shù)52使用默認(rèn)參數(shù)的構(gòu)造函數(shù),如果創(chuàng)建對(duì)象時(shí)不需要通過(guò)傳遞參數(shù)來(lái)初始化對(duì)象,可以使用它。例gf8:將例gf7的構(gòu)造函數(shù)改為含默認(rèn)值參數(shù)值,長(zhǎng)、寬、高的默認(rèn)值均為10。構(gòu)造函數(shù)和析構(gòu)函數(shù)

應(yīng)該在聲明構(gòu)造函數(shù)時(shí)指定參數(shù)的默認(rèn)值,而不能只在定義構(gòu)造函數(shù)時(shí)指定默認(rèn)值;

如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認(rèn)值,則在

定義對(duì)象時(shí)可以不給出,或給出一個(gè)、幾個(gè)實(shí)參;

在一個(gè)類(lèi)中定義了全部默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù),否則會(huì)出現(xiàn)二義性。使用默認(rèn)參數(shù)的構(gòu)造函數(shù)注意:在構(gòu)造函數(shù)中使用默認(rèn)參數(shù)提供了建立對(duì)象的多種初始化方法,相當(dāng)于多個(gè)重載的構(gòu)造函數(shù);Box(int

=10,int

=10,int

=10);//指定全部參數(shù)為默認(rèn)參數(shù)53//聲明無(wú)參構(gòu)造函數(shù),是重載構(gòu)造函數(shù)//聲明有2個(gè)參數(shù)的構(gòu)造函數(shù)Box();Box(int,int);若有以下語(yǔ)句:

Box

box1;//無(wú)法確定調(diào)用第1個(gè)、還是第2個(gè)構(gòu)造函數(shù)?Box

box2(15,30);//無(wú)法確定調(diào)用第1個(gè)、還是第3個(gè)構(gòu)造函數(shù)?例2.5.5??截悩?gòu)造函數(shù)54拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類(lèi)的對(duì)象引用。class

類(lèi)名{ public

:類(lèi)名(形參);//構(gòu)造函數(shù)類(lèi)名(類(lèi)名&對(duì)象名);//拷貝構(gòu)造函數(shù)...};類(lèi)名::類(lèi)名(類(lèi)名&對(duì)象名)//拷貝構(gòu)造函數(shù)的實(shí)現(xiàn){

函數(shù)體

}構(gòu)造函數(shù)和析構(gòu)函數(shù)例:拷貝構(gòu)造函數(shù)舉例55class

Point{public:Point(int

xx=0,int

yy=0){X=xx;

Y=yy;}Point(Point&

p);int

GetX()

{return

X;}int

GetY()

{return

Y;}private:int

X,Y;};構(gòu)造函數(shù)和析構(gòu)函數(shù)Point::Point

(Point&

p){X=p.X;Y=p.Y;cout<<"拷貝構(gòu)造函數(shù)被調(diào)用"<<endl;}34例:拷貝構(gòu)造函數(shù)舉例57當(dāng)用類(lèi)的一個(gè)對(duì)象去初始化該類(lèi)的另一個(gè)對(duì)象時(shí)系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)實(shí)現(xiàn)拷貝賦值。void

main(void){ Point

A(1,2);Point

B(A);//拷貝構(gòu)造函數(shù)被調(diào)用

cout<<B.GetX()<<endl;}構(gòu)造函數(shù)和析構(gòu)函數(shù)例:拷貝構(gòu)造函數(shù)舉例58若函數(shù)的形參為類(lèi)對(duì)象,調(diào)用函數(shù)時(shí),實(shí)參賦值給形參,系統(tǒng)自動(dòng)調(diào)用拷貝

構(gòu)造函數(shù)。例如:void

fun1(Point

p){

cout<<p.GetX()<<endl;}void

main(){ Point

A(1,2);fun1(A);//調(diào)用拷貝構(gòu)造函數(shù)}構(gòu)造函數(shù)和析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)59當(dāng)函數(shù)的返回值是類(lèi)對(duì)象時(shí),系統(tǒng)自動(dòng)調(diào)用拷貝構(gòu)造函數(shù)。例如:Point

fun2(){Point

A(1,2);return

A;//調(diào)用拷貝構(gòu)造函數(shù)}void

main(){Point

B;B=fun2();}構(gòu)造函數(shù)和析構(gòu)函數(shù)拷貝構(gòu)造函數(shù)60如果程序員沒(méi)有為類(lèi)聲明拷貝初始化構(gòu)造函數(shù),則編譯器自己生成一個(gè)拷貝構(gòu)造函數(shù)。這個(gè)構(gòu)造函數(shù)執(zhí)行的功能是:用作

為初始值的對(duì)象的每個(gè)數(shù)據(jù)成員的值,

初始化將要建立的對(duì)象的對(duì)應(yīng)數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)析構(gòu)函數(shù)61完成對(duì)象被刪除前的一些清理工作。在對(duì)象的生存期結(jié)束的時(shí)刻系統(tǒng)自動(dòng)調(diào)用它,然后再釋放此對(duì)象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動(dòng)產(chǎn)生一個(gè)默認(rèn)的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)析構(gòu)函數(shù)62析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)的特點(diǎn):析構(gòu)函數(shù)不能接受任何參數(shù),也沒(méi)有返回類(lèi)型說(shuō)明;一個(gè)類(lèi)只有一個(gè)析構(gòu)函數(shù),如果用戶(hù)未編寫(xiě)析構(gòu)函數(shù),編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)缺省的析構(gòu)函數(shù),此函數(shù)不做任何事情;析構(gòu)函數(shù)不能重載。構(gòu)造函數(shù)和析構(gòu)函數(shù)何時(shí)執(zhí)行析構(gòu)函數(shù)?63一個(gè)函數(shù)中定義的對(duì)象(自動(dòng)局部的),在這個(gè)函數(shù)結(jié)束調(diào)用時(shí),對(duì)象應(yīng)該釋放,并在對(duì)象釋放前自動(dòng)執(zhí)行析構(gòu)函數(shù);static類(lèi)型的局部對(duì)象在函數(shù)調(diào)用結(jié)束時(shí)并不釋放,也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時(shí),才調(diào)用static局部對(duì)象的析構(gòu)函數(shù);一個(gè)全局對(duì)象,在程序離開(kāi)其作用域時(shí)(如main函數(shù)結(jié)束或調(diào)用exit函數(shù)),調(diào)用該全局對(duì)象的析構(gòu)函數(shù);用new運(yùn)算符動(dòng)態(tài)建立的對(duì)象,當(dāng)用delete運(yùn)算符釋放該對(duì)象時(shí),先調(diào)用該對(duì)象的析構(gòu)函數(shù);如果用戶(hù)沒(méi)定義析構(gòu)函數(shù),C++編譯系統(tǒng)會(huì)自動(dòng)生成一個(gè)析構(gòu)函數(shù),只是它實(shí)際上不執(zhí)行任何操作。例gf9

包含構(gòu)造函數(shù)和析構(gòu)函數(shù)的C++程序。64構(gòu)造函數(shù)和析構(gòu)函數(shù)共同點(diǎn)都沒(méi)有返回值,無(wú)需指出返回類(lèi)型;不能被繼承;構(gòu)造函數(shù)可以有缺省參數(shù);不能用常規(guī)調(diào)用方法調(diào)用構(gòu)造函數(shù);當(dāng)

使用完全的限定名(包括對(duì)象名、類(lèi)名、函數(shù)名)時(shí)可以調(diào)用析構(gòu)函數(shù);定義對(duì)象時(shí),編譯程序自動(dòng)調(diào)用構(gòu)造函數(shù),刪除對(duì)象時(shí),編譯程序自動(dòng)調(diào)用析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序65調(diào)用析構(gòu)函數(shù)的次序正好與調(diào)用構(gòu)造函數(shù)的次序相反,最先被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的(同一對(duì)象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被調(diào)用的構(gòu)造函數(shù),其對(duì)應(yīng)的析構(gòu)函數(shù)最先被調(diào)用;“先構(gòu)造的后析構(gòu)、后構(gòu)造的先析構(gòu)”的先進(jìn)后出的特征。構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)的順序66構(gòu)造函數(shù)和析構(gòu)函數(shù)67指針的基本概念對(duì)象指針指針可以指向所有對(duì)象指針指向變量--指針變量(存變量的地址)指針指向數(shù)組--數(shù)組指針(存數(shù)組的起始地址)指針指向函數(shù)--函數(shù)指針(存放函數(shù)的入口地址)指針指向指針--指針型指針(存放某指針的地址)由指針組成的數(shù)組--指針數(shù)組指針指向結(jié)構(gòu)--結(jié)構(gòu)指針指針指向?qū)ο蟆獙?duì)象指針指針是一種可定位其他對(duì)象的特殊類(lèi)型的數(shù)據(jù)(存放其他對(duì)象的首地址)指針是一種可定位其他對(duì)象的特殊類(lèi)型的數(shù)據(jù)(存放其他對(duì)象的首地址)指向?qū)ο蟮闹羔?8對(duì)象存儲(chǔ)空間的起始地址叫對(duì)象指針;可以定義一個(gè)指針變量,存放對(duì)象空間的起始地址,如:Time

t1;

//創(chuàng)建Time類(lèi)對(duì)象t1Time

*pt=

&t1

;//定義指向Time類(lèi)對(duì)象//的指針pt,并將t1的起始地址賦給pt對(duì)象指針指向?qū)ο蟮闹羔?9可以通過(guò)對(duì)象指針訪(fǎng)問(wèn)對(duì)象和對(duì)象的成員,如:*pt(*pt).hour//pt所指向?qū)ο髏1//pt所指向?qū)ο笾械膆our成員,即t1.

hour//pt所指向?qū)ο笾械膆our成員,pt

->

hour即t1.

hour(*pt).get_time()

//調(diào)用pt所指向的對(duì)象中的

get_time函數(shù),即t1.

get_timept->get_time()

//調(diào)用pt所指向的對(duì)象中的

get_time函數(shù),即t1.

get_time對(duì)象指針指向?qū)ο蟪蓡T的指針70指向?qū)ο髷?shù)據(jù)成員的指針:數(shù)據(jù)類(lèi)型名*指針變量名;

p1=&t1.hour;//將對(duì)象t1的數(shù)據(jù)成員hour的地址賦給p1,p1指向t1.

hourcout

<<*p1

<<endl;//輸出t1.

hour的值對(duì)象指針指向?qū)ο蟪蓡T的指針71指向?qū)ο蟪蓡T函數(shù)的指針:1、普通函數(shù):數(shù)據(jù)類(lèi)型名(*指針變量名)(參數(shù)表列);2、指向公用成員函數(shù)的指針變量:數(shù)據(jù)類(lèi)型名(類(lèi)::*指針變量名)(參數(shù)表列);3、使指針變量指向一個(gè)公用成員函數(shù)的一般形式為:指針變量名=&類(lèi)名::成員函數(shù)名;例gf17。對(duì)象指針this指針72隱含于每一個(gè)類(lèi)的成員函數(shù)中的特殊指針。明確地指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對(duì)象。–當(dāng)通過(guò)一個(gè)對(duì)象調(diào)用成員函數(shù)時(shí),系統(tǒng)先將該對(duì)象的地址賦給this指針,然后調(diào)用成員函數(shù),成員函數(shù)對(duì)對(duì)象的數(shù)據(jù)成員進(jìn)行操作時(shí),就隱含使用了this指針。對(duì)象指針this指針73例如:Point類(lèi)的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論