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

下載本文檔

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

文檔簡(jiǎn)介

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

struct

Student{int

num;char

name[20]

;char

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

stud1,stud2class

Student

//聲明類,以class開頭{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類的對(duì)象stud1,stud2;5Student

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

private

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

Student

//聲明類類型{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++中,定義類的一般格式為:class

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

CArea{private://私有部分int

x,

y,

area;public:

//公有部分void

squarea(int

vx,

int

vy);};例題3.

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

Clock{public:void

SetTime(int

NewH,

int

NewM,int

NewS);void

ShowTime();private:int

Hour,

Minute,

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

Clock

::

SetTime(int

NewH,

int

NewM,int

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

Clock

::

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

Student

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

類名對(duì)象名;如

class

Student

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

Student

stud1,stud2;類的聲明和對(duì)象的定義定義對(duì)象的方法2、在聲明類類型的同時(shí)定義對(duì)象://聲明類類型//先聲明公用部分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類的對(duì)象stud1,stud192類的聲明和對(duì)象的定義20定義對(duì)象的方法3、不出現(xiàn)類名,直接定義對(duì)象://聲明類類型//聲明公用部分//聲明私有部分//聲明保護(hù)部分class{

public:……private:……protected:……}stud1,stud2;//定義對(duì)象stud1,stud2定義多個(gè)對(duì)象時(shí),對(duì)象名之間用逗號(hào)隔開;對(duì)象名可以是一般的對(duì)象、指向?qū)ο蟮闹羔樆蛞妹?,也可以是?duì)象數(shù)組。類的聲明和對(duì)象的定義例3.221定義一個(gè)日期類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或者定義類之后:CDate

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

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

返回值類型

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

……

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

Student

{public:void

display(

);private:intnum;string

name;charsex;};void

Student

::display()

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

num

<<

endl;cout

<<“name:”<<

name

<<

endl;cout

<<“sex:”<<

sex

<<

endl;

}Student

stud1,stud2;

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

Point{public:void

Init(int

initX,int

initY);int

GetX();int

GetY();private:int

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

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

個(gè)同類對(duì)象成員函數(shù)的存儲(chǔ)方式C++規(guī)定:對(duì)象占用的存儲(chǔ)空間只是對(duì)象數(shù)據(jù)成員占用的存儲(chǔ)空間,可用sizeof函數(shù)驗(yàn)證;共同的成員函數(shù)代碼存儲(chǔ)在對(duì)象空間之外。類的成員函數(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++專門為此設(shè)計(jì)了一個(gè)this指針,用來指向不同的對(duì)象;調(diào)用哪個(gè)對(duì)象,this就指向哪個(gè)對(duì)象,就訪問它的成員。類的成員函數(shù)類中成員的訪問方式32類中成員互訪直接使用成員名類外訪問使用“對(duì)象名.成員名”方式訪問public屬性的成員類的成員函數(shù)例:類的應(yīng)用舉例33#include<iostream>using

namespace

std;class

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

void

main(void){

Clock

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

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

num

=1001;stud1.

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

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

t,*p=&t;cout<<p->hour;//hour是t中的成員3、通過對(duì)象的引用變量訪問對(duì)象中的成員。類的成員函數(shù)構(gòu)造函數(shù)36構(gòu)造函數(shù)的作用是在對(duì)象被創(chuàng)建時(shí)使用特定的值構(gòu)造對(duì)象,或者說將對(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ù)的名字必須與類名相同;構(gòu)造函數(shù)一般聲明為public,無返回值,無需定義返回類型;構(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ù),可以為無參數(shù)或帶參數(shù),還可以缺省參數(shù),例如:無參的構(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;}

//無參數(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ù)};在類中聲明的多種構(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

在類中定義構(gòu)造函數(shù)。42構(gòu)造函數(shù)的使用何時(shí)調(diào)用構(gòu)造函數(shù)?在類對(duì)象進(jìn)入其作用域時(shí)調(diào)用構(gòu)造函數(shù);構(gòu)造函數(shù)沒有返回值,不要在定義構(gòu)造函數(shù)時(shí)聲明類型;構(gòu)造函數(shù)不需要用戶調(diào)用,也不能被用戶調(diào)用;在構(gòu)造函數(shù)體中,不僅可以對(duì)數(shù)據(jù)成員賦初值,還可以包含其他語句如cout;如果用戶沒有定義構(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í),通過不同參數(shù)值的傳遞實(shí)現(xiàn)不同對(duì)象的不同初始化,可以使用帶參數(shù)的構(gòu)造函數(shù);一般格式:構(gòu)造函數(shù)名(類型1

形參1,類型2

形參2,……)用戶不能顯式地調(diào)用構(gòu)造函數(shù),也無法采用常規(guī)的調(diào)用函數(shù)的方法給出實(shí)參(如fun(a,b))。實(shí)參只能在定義對(duì)象時(shí)給出,定義對(duì)象的一般格式:類名對(duì)象名(實(shí)參1,實(shí)參2,……);例gf6:有兩個(gè)長(zhǎng)方體,長(zhǎng)、寬、高分別為:(1)12,25,30;(2)15,30,21。用帶參數(shù)的構(gòu)造函數(shù)編寫程序求其體積。構(gòu)造函數(shù)和析構(gòu)函數(shù)使用參數(shù)初始化表44在定義對(duì)象時(shí),可使用參數(shù)初始化表來實(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è)類可以定義多個(gè)構(gòu)造函數(shù),使用戶選用不同的方式完成對(duì)象數(shù)據(jù)的初始化;重載的所有構(gòu)造函數(shù)同名,但其參數(shù)類型、參數(shù)個(gè)數(shù)必須有所區(qū)別。構(gòu)造函數(shù)和析構(gòu)函數(shù)46重載構(gòu)造函數(shù)的例子例,可以在類中聲明的多種構(gòu)造函數(shù):class

CArea{public:CArea(

){x=0;

y=0;}

//無參數(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è)無參數(shù),一個(gè)有參數(shù)。缺省構(gòu)造函數(shù)47在調(diào)用構(gòu)造函數(shù)時(shí)不必給出實(shí)參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)(DefaultConstructor)或缺省構(gòu)造函數(shù);無參數(shù)的構(gòu)造函數(shù)屬于缺省構(gòu)造函數(shù);如果在定義對(duì)象時(shí)選用無參構(gòu)造函數(shù),應(yīng)按以下形式定義對(duì)象:Box

box1;//調(diào)用無參構(gòu)造函數(shù)建立對(duì)象在一個(gè)類中可以包含多個(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)形參值的說明次序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)形參值的說明應(yīng)保持唯一,但如果在不同的作用域內(nèi),允許說明不同的默認(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í)不需要通過傳遞參數(shù)來初始化對(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è)類中定義了全部默認(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//聲明無參構(gòu)造函數(shù),是重載構(gòu)造函數(shù)//聲明有2個(gè)參數(shù)的構(gòu)造函數(shù)Box();Box(int,int);若有以下語句:

Box

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

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

類名{ public

:類名(形參);//構(gòu)造函數(shù)類名(類名&對(duì)象名);//拷貝構(gòu)造函數(shù)...};類名::類名(類名&對(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)用類的一個(gè)對(duì)象去初始化該類的另一個(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ù)的形參為類對(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ù)的返回值是類對(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如果程序員沒有為類聲明拷貝初始化構(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ù),也沒有返回類型說明;一個(gè)類只有一個(gè)析構(gòu)函數(shù),如果用戶未編寫析構(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類型的局部對(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ì)象,在程序離開其作用域時(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ù);如果用戶沒定義析構(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)都沒有返回值,無需指出返回類型;不能被繼承;構(gòu)造函數(shù)可以有缺省參數(shù);不能用常規(guī)調(diào)用方法調(diào)用構(gòu)造函數(shù);當(dāng)

使用完全的限定名(包括對(duì)象名、類名、函數(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ì)象的特殊類型的數(shù)據(jù)(存放其他對(duì)象的首地址)指針是一種可定位其他對(duì)象的特殊類型的數(shù)據(jù)(存放其他對(duì)象的首地址)指向?qū)ο蟮闹羔?8對(duì)象存儲(chǔ)空間的起始地址叫對(duì)象指針;可以定義一個(gè)指針變量,存放對(duì)象空間的起始地址,如:Time

t1;

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

*pt=

&t1

;//定義指向Time類對(duì)象//的指針pt,并將t1的起始地址賦給pt對(duì)象指針指向?qū)ο蟮闹羔?9可以通過對(duì)象指針訪問對(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ù)類型名*指針變量名;

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ù)類型名(*指針變量名)(參數(shù)表列);2、指向公用成員函數(shù)的指針變量:數(shù)據(jù)類型名(類::*指針變量名)(參數(shù)表列);3、使指針變量指向一個(gè)公用成員函數(shù)的一般形式為:指針變量名=&類名::成員函數(shù)名;例gf17。對(duì)象指針this指針72隱含于每一個(gè)類的成員函數(shù)中的特殊指針。明確地指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對(duì)象。–當(dāng)通過一個(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類的

溫馨提示

  • 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)論