版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024石家莊公租房租賃合同編寫(xiě)指南及范本3篇
- 2024版貨物訂購(gòu)合同
- 2024英文企業(yè)海外市場(chǎng)拓展與業(yè)務(wù)洽談合同3篇
- 2025年度園林景觀沙石供應(yīng)與施工承包合同樣本4篇
- 2025年度醫(yī)藥代銷(xiāo)合同模板(醫(yī)藥供應(yīng)鏈)4篇
- 2025年度商業(yè)街區(qū)物業(yè)管理與服務(wù)合同3篇
- 2025年度商場(chǎng)家具安裝與商業(yè)空間優(yōu)化承包協(xié)議4篇
- 2024版權(quán)評(píng)估合同3篇帶眉腳
- 2025年度溫室大棚配套設(shè)施供應(yīng)與售后服務(wù)合同4篇
- 2025年度智慧城市基礎(chǔ)設(shè)施建設(shè)承包協(xié)議4篇
- 2023年日語(yǔ)考試:大學(xué)日語(yǔ)六級(jí)真題模擬匯編(共479題)
- 皮帶拆除安全技術(shù)措施
- ISO9001(2015版)質(zhì)量體系標(biāo)準(zhǔn)講解
- 《培訓(xùn)資料緊固》課件
- 黑龍江省政府采購(gòu)評(píng)標(biāo)專(zhuān)家考試題
- 成品煙道安裝施工方案
- 醫(yī)療免責(zé)協(xié)議書(shū)范本
- 2023山東春季高考數(shù)學(xué)真題(含答案)
- 2022年初中歷史課程標(biāo)準(zhǔn)電子版
- 高中生物 人教版 選修二《生態(tài)系統(tǒng)及其穩(wěn)定性》 《生態(tài)系統(tǒng)及其穩(wěn)定性》單元教學(xué)設(shè)計(jì)
- 工程勘察設(shè)計(jì)收費(fèi)標(biāo)準(zhǔn)(2002年修訂本)完整版
評(píng)論
0/150
提交評(píng)論