版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 貴州城市職業(yè)學(xué)院《醫(yī)用治療儀器》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025安徽省安全員-C證考試(專職安全員)題庫及答案
- 2025江蘇省建筑安全員B證考試題庫及答案
- 貴陽人文科技學(xué)院《中國古代文學(xué)一》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025遼寧省建筑安全員《B證》考試題庫
- 2025湖南省安全員知識(shí)題庫及答案
- 2025四川建筑安全員B證考試題庫
- 2025重慶市建筑安全員C證(專職安全員)考試題庫
- 2025甘肅省建筑安全員知識(shí)題庫
- 2025年海南建筑安全員C證(專職安全員)考試題庫
- 學(xué)校膳食管理委員會(huì)工作制度和職責(zé)
- 房租收條格式(3篇)
- 期末試卷(試題)2024-2025學(xué)年培智生活語文二年級(jí)上冊(cè)
- 2024秋期國家開放大學(xué)本科《中國當(dāng)代文學(xué)專題》一平臺(tái)在線形考(形考任務(wù)一至六)試題及答案
- 期末(試題)-2024-2025學(xué)年人教PEP版(2024)英語三年級(jí)上冊(cè)
- 2024伊利在線測(cè)評(píng)題
- 安徽省A10聯(lián)盟2025屆高二上數(shù)學(xué)期末考試試題含解析
- 紅色簡(jiǎn)約中國英雄人物李大釗課件
- 小學(xué)師德考評(píng)細(xì)則
- 軟件定義網(wǎng)絡(luò)(SDN)實(shí)戰(zhàn)教程課件
- 上海市住院醫(yī)師規(guī)范化培訓(xùn)公共科目考試題庫-重點(diǎn)傳染病防治知識(shí)
評(píng)論
0/150
提交評(píng)論