




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
模塊三C++類及其對象的封裝性C++面向?qū)ο蟪绦蛟O(shè)計本模塊主要內(nèi)容2類的聲明和對象定義類的成員函數(shù)對象成員的引用構(gòu)造函數(shù)和析構(gòu)函數(shù)對象指針動態(tài)存儲類的聲明和對象定義3C++類及其對象的封裝性類是具有相同屬性和行為的一組對象的集合,它為屬于該類的全部對象提供了統(tǒng)一的抽象描述,其內(nèi)部包括屬性和行為兩個主要部分。利用類可以實現(xiàn)數(shù)據(jù)的封裝、隱藏、繼承與派生。利用類易于編寫大型復(fù)雜程序,其模塊化程度比C中采用函數(shù)更高。類的聲明和對象定義4C++類及其對象的封裝性類是對象共性特征的抽象,對象的類型稱為類,類是對象的模板,對象是類的具體實例;先聲明一個類,再定義對象,類是抽象的,不占用內(nèi)存,對象是具體的,占用實際的存儲空間;可以看作是一種特殊的構(gòu)造數(shù)據(jù)類型,是結(jié)構(gòu)體的擴(kuò)充形式;類是數(shù)據(jù)和對這些數(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個結(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類的對象stud1,stud2;5Student
stud1,stud2;6類的聲明和對象定義上述類定義中未限定成員的訪問屬性,對象stud1的數(shù)據(jù)和函數(shù)都是private的,數(shù)據(jù)安全了。但外界不能調(diào)用stud1中的函數(shù)和功能,因為沒有提供類的對外的接口,類有何用?不能把類中的全部成員與外界隔離,一般將類中的數(shù)據(jù)隱藏起來,聲明為私有的(
private
),把成員函數(shù)作為對外界的接口,聲明為公有的(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ù)。類的聲明和對象的定義私有類型成員9在關(guān)鍵字private后面聲明,只允許本類中的函數(shù)訪問,而類外部的任何函數(shù)都不能訪問。如果緊跟在類名稱的后面聲明私有成員,則關(guān)鍵字private可以省略。類的聲明和對象的定義保護(hù)類型10與private類似,其差別表現(xiàn)在繼承與派生時對派生類的影響不同。類的聲明和對象的定義在類的定義中應(yīng)注意以下幾點:111、“類名”是一個合法的標(biāo)識符;2、關(guān)鍵字private,public和protected說明類成員的三種訪問權(quán)限;3、{}以內(nèi)的部分是“類內(nèi)”,{}以外的部分為“類外”;4、類定義的聲明部分在“類內(nèi)”,類的成員函數(shù)既可以在“類內(nèi)”定義,也可以在“類外”定義;5、在“類內(nèi)”不允許對所聲明的數(shù)據(jù)成員進(jìn)行初始化,類的數(shù)據(jù)成員的類型可以任意。12//聲明一個類class
CArea{private://私有部分int
x,
y,
area;public:
//公有部分void
squarea(int
vx,
int
vy);};例題3.
1數(shù)據(jù)成員13與一般的變量聲明相同,但需要將它放在類的聲明體中。類的聲明和對象的定義成員函數(shù)14在類中說明原形,可以在類外給出函數(shù)體實現(xiàn),并在函數(shù)名前使用類名加以限定。也可以直接在類中給出函數(shù)體,形成內(nèi)置成員函數(shù)。允許聲明重載函數(shù)和帶默認(rèn)形參值的函數(shù)。類的聲明和對象的定義類的成員class
Clock{public:void
SetTime(int
NewH,
int
NewM,int
NewS);void
ShowTime();private:int
Hour,
Minute,
Second;};成員數(shù)據(jù)成員函數(shù)15類的聲明和對象的定義void
Clock
::
SetTime(int
NewH,
int
NewM,int
NewS){Hour=NewH;Minute=NewM;Second=NewS;}void
Clock
::
ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}16類的聲明和對象的定義類和結(jié)構(gòu)體的異同1、均為構(gòu)造類型;2、結(jié)構(gòu)體用struct、類用class作為標(biāo)識;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)沒有實現(xiàn)數(shù)據(jù)封裝,數(shù)據(jù)可以被任何外部函數(shù)訪問。類實現(xiàn)了數(shù)據(jù)封裝,可以將數(shù)據(jù)限定為只能被本身的成員函數(shù)訪問。17類的聲明和對象的定義18定義對象的方法1、先聲明類類型,然后再定義對象:如
Student
stud1,stud2;在聲明類類型之后,定義對象有2種方法:class
類名對象名;如
class
Student
stud1,stud2;類名對象名;如
Student
stud1,stud2;類的聲明和對象的定義定義對象的方法2、在聲明類類型的同時定義對象://聲明類類型//先聲明公用部分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類的對象stud1,stud192類的聲明和對象的定義20定義對象的方法3、不出現(xiàn)類名,直接定義對象://聲明類類型//聲明公用部分//聲明私有部分//聲明保護(hù)部分class{
public:……private:……protected:……}stud1,stud2;//定義對象stud1,stud2定義多個對象時,對象名之間用逗號隔開;對象名可以是一般的對象、指向?qū)ο蟮闹羔樆蛞妹?,也可以是對象?shù)組。類的聲明和對象的定義例3.221定義一個日期類CDate,再創(chuàng)建一個生日對象。class
CDate{int
year;int
month;int
day;public:voidSetDate(int,int,int);void
ShowDate();}myBirthday;
//同時創(chuàng)建對象myBirthday或者定義類之后:CDate
myBirthday,*p,q[5];類的聲明和對象的定義類的成員函數(shù)C++類及其對象的封裝性類的成員函數(shù)具有一般函數(shù)的性質(zhì),它同時屬于某個類的成員,出現(xiàn)在類定義體中,可被限定為具有
private、public和protected三種訪問屬性;成員函數(shù)可以訪問本類中的任何成員(包括private和public特性),可以引用在本作用域中有效的數(shù)據(jù);private屬性的成員函數(shù)只能被本類其它的成員函數(shù)調(diào)用,不能被外界調(diào)用;public屬性的成員函數(shù)可以被外界調(diào)用,它是類的對外接口。22在類外定義成員函數(shù)23類的成員函數(shù)類的成員函數(shù)可以在“類內(nèi)”聲明,在“類外”定義;類外定義成員函數(shù)的一般形式如下:
返回值類型
類名::成員函數(shù)名(參數(shù)表){
……
//函數(shù)體}其中::是作用域運算符。例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個類對象類的成員函數(shù)25內(nèi)置(inline)成員函數(shù)有些簡單的成員函數(shù)可以直接在類定義中定義,在類定義體中定義的成員函數(shù)稱為內(nèi)置函數(shù)(內(nèi)聯(lián)函數(shù));內(nèi)置函數(shù)可以減少函數(shù)調(diào)用時的內(nèi)存開銷,不用記錄函數(shù)調(diào)用返回地址,只將代碼嵌入到函數(shù)調(diào)用點內(nèi)置函數(shù)的定義有兩種方法:1、隱式定義將成員函數(shù)的定義體放在“類內(nèi)”中。2、顯式定義在“類內(nèi)”聲明,在“類外”定義時在函數(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ù)的存儲方式定義類對象時,系統(tǒng)會為每個對象分配存儲空間,包括為類對象的數(shù)據(jù)和函數(shù)代碼分配空間;如果定義同類的10個對象,那么如何為這10個對象分配不同的空間?10
個同類對象占用存儲單元的情況類的成員函數(shù)30成員函數(shù)的存儲方式為了節(jié)約內(nèi)存,只用一段存儲空間來存放10個對象擁有的共同的函數(shù)代碼段,如下圖:10
個同類對象成員函數(shù)的存儲方式C++規(guī)定:對象占用的存儲空間只是對象數(shù)據(jù)成員占用的存儲空間,可用sizeof函數(shù)驗證;共同的成員函數(shù)代碼存儲在對象空間之外。類的成員函數(shù)31成員函數(shù)的存儲方式調(diào)用不同對象的成員函數(shù)時都是執(zhí)行同一段函數(shù)代碼,但其執(zhí)行結(jié)果一般不同(常與數(shù)據(jù)有關(guān));不同對象使用同一段函數(shù)代碼,它們?nèi)绾螌Σ煌瑢ο笾械臄?shù)據(jù)進(jìn)行操作呢?C++專門為此設(shè)計了一個this指針,用來指向不同的對象;調(diào)用哪個對象,this就指向哪個對象,就訪問它的成員。類的成員函數(shù)類中成員的訪問方式32類中成員互訪直接使用成員名類外訪問使用“對象名.成員名”方式訪問public屬性的成員類的成員函數(shù)例:類的應(yīng)用舉例33#include<iostream>using
namespace
std;class
Clock{......//類的聲明略}//......類的實現(xiàn)略
void
main(void){
Clock
myClock;myClock.SetTime(8,30,30);myClock.ShowTime();}類的成員函數(shù)對象成員的引用34訪問對象中的成員有3種方法:1、通過對象名和成員運算符訪問對象中的成員,即:對象名.數(shù)據(jù)成員名or
對象名.成員函數(shù)名(參數(shù)表)例如:stud1.
num
=1001;stud1.
display();//設(shè)num和display函數(shù)為public成員類的成員函數(shù)35對象成員的引用定義一個日期類,使其具有輸出當(dāng)前日期的功能。例gf4:引用對象的成員2、通過指向?qū)ο蟮闹羔樤L問對象中的成員,即:對象指針->數(shù)據(jù)成員名or
對象指針->成員函數(shù)名(參數(shù)表)例如:Time
t,*p=&t;cout<<p->hour;//hour是t中的成員3、通過對象的引用變量訪問對象中的成員。類的成員函數(shù)構(gòu)造函數(shù)36構(gòu)造函數(shù)的作用是在對象被創(chuàng)建時使用特定的值構(gòu)造對象,或者說將對象初始化為一個特定的狀態(tài)。在對象創(chuàng)建時由系統(tǒng)自動調(diào)用。如果程序中未聲明,則系統(tǒng)自動產(chǎn)生出一個默認(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)自動調(diào)用的,且執(zhí)行一次;構(gòu)造函數(shù)不能被繼承,但允許重載(overloading);構(gòu)造函數(shù)的功能是對對象進(jìn)行初始化,一般構(gòu)造函數(shù)用于對象的初始化,每當(dāng)對象被聲明時對數(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ù)//帶一個參數(shù)的構(gòu)造函數(shù)CArea(float
rr,char
*ra);
//帶兩個參數(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ù)的實現(xiàn):31Clock::Clock(int
NewH,
int
NewM,
int
NewS){Hour=
NewH;Minute=
NewM;Second=
NewS;}建立對象時構(gòu)造函數(shù)的作用:void
main(){Clock c
(0,0,0);//隱含調(diào)用構(gòu)造函數(shù),將初始值作為實參。
c.ShowTime();}例gf5
在類中定義構(gòu)造函數(shù)。42構(gòu)造函數(shù)的使用何時調(diào)用構(gòu)造函數(shù)?在類對象進(jìn)入其作用域時調(diào)用構(gòu)造函數(shù);構(gòu)造函數(shù)沒有返回值,不要在定義構(gòu)造函數(shù)時聲明類型;構(gòu)造函數(shù)不需要用戶調(diào)用,也不能被用戶調(diào)用;在構(gòu)造函數(shù)體中,不僅可以對數(shù)據(jù)成員賦初值,還可以包含其他語句如cout;如果用戶沒有定義構(gòu)造函數(shù),C++系統(tǒng)會自動生成一個構(gòu)造函數(shù),其函數(shù)體為空,不執(zhí)行初始化操作;要想初始化一個對象,需要重新定義構(gòu)造函數(shù),否則對象的狀態(tài)將是隨機(jī)的。構(gòu)造函數(shù)和析構(gòu)函數(shù)43帶參數(shù)的構(gòu)造函數(shù)定義對象時,通過不同參數(shù)值的傳遞實現(xiàn)不同對象的不同初始化,可以使用帶參數(shù)的構(gòu)造函數(shù);一般格式:構(gòu)造函數(shù)名(類型1
形參1,類型2
形參2,……)用戶不能顯式地調(diào)用構(gòu)造函數(shù),也無法采用常規(guī)的調(diào)用函數(shù)的方法給出實參(如fun(a,b))。實參只能在定義對象時給出,定義對象的一般格式:類名對象名(實參1,實參2,……);例gf6:有兩個長方體,長、寬、高分別為:(1)12,25,30;(2)15,30,21。用帶參數(shù)的構(gòu)造函數(shù)編寫程序求其體積。構(gòu)造函數(shù)和析構(gòu)函數(shù)使用參數(shù)初始化表44在定義對象時,可使用參數(shù)初始化表來實現(xiàn)對數(shù)據(jù)成員的初始化,在函數(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òu)造函數(shù),使用戶選用不同的方式完成對象數(shù)據(jù)的初始化;重載的所有構(gòu)造函數(shù)同名,但其參數(shù)類型、參數(shù)個數(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;}
//帶一個參數(shù)的構(gòu)造函數(shù)
CArea(float
rr,char
*ra);
//帶兩個參數(shù)的構(gòu)造函數(shù)};例gf7
在例gf6的基礎(chǔ)上定義兩個構(gòu)造函數(shù),其中一個無參數(shù),一個有參數(shù)。缺省構(gòu)造函數(shù)47在調(diào)用構(gòu)造函數(shù)時不必給出實參的構(gòu)造函數(shù),稱為默認(rèn)構(gòu)造函數(shù)(DefaultConstructor)或缺省構(gòu)造函數(shù);無參數(shù)的構(gòu)造函數(shù)屬于缺省構(gòu)造函數(shù);如果在定義對象時選用無參構(gòu)造函數(shù),應(yīng)按以下形式定義對象:Box
box1;//調(diào)用無參構(gòu)造函數(shù)建立對象在一個類中可以包含多個構(gòu)造函數(shù),但是在創(chuàng)建每個對象時,只執(zhí)行其中一個匹配版本的構(gòu)造函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)默認(rèn)形參值的作用48函數(shù)在聲明時可以預(yù)先給出默認(rèn)的形參值,調(diào)用時如給出實參,則采用實參值,否則采用預(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ù)。因為調(diào)用時實參取代形參是從左向右的順序。例:int
add(int
x,int
y=5,int
z=6);//正確
int
add(int
x=1,int
y=5,int
z);//錯誤
int
add(int
x=1,int
y,int
z=6);//錯誤默認(rèn)形參值與函數(shù)的調(diào)用位置調(diào)用出現(xiàn)在函數(shù)體實現(xiàn)之前時,默認(rèn)形參值必
須在函數(shù)原形中給出;而當(dāng)調(diào)用出現(xiàn)在函數(shù)體
實現(xiàn)之后時,默認(rèn)形參值需在函數(shù)實現(xiàn)時給出。例:int
add(int
x=5,int
y=6);void
main(void){
add();//調(diào)用在實現(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)用在實現(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)形參值(實現(xiàn)3+4)}void
fun(void){
...add();
//使用全局默認(rèn)形參值(實現(xiàn)1+2)}使用默認(rèn)參數(shù)的構(gòu)造函數(shù)52使用默認(rèn)參數(shù)的構(gòu)造函數(shù),如果創(chuàng)建對象時不需要通過傳遞參數(shù)來初始化對象,可以使用它。例gf8:將例gf7的構(gòu)造函數(shù)改為含默認(rèn)值參數(shù)值,長、寬、高的默認(rèn)值均為10。構(gòu)造函數(shù)和析構(gòu)函數(shù)
應(yīng)該在聲明構(gòu)造函數(shù)時指定參數(shù)的默認(rèn)值,而不能只在定義構(gòu)造函數(shù)時指定默認(rèn)值;
如果構(gòu)造函數(shù)的全部參數(shù)都指定了默認(rèn)值,則在
定義對象時可以不給出,或給出一個、幾個實參;
在一個類中定義了全部默認(rèn)參數(shù)的構(gòu)造函數(shù)后,不能再定義重載構(gòu)造函數(shù),否則會出現(xiàn)二義性。使用默認(rèn)參數(shù)的構(gòu)造函數(shù)注意:在構(gòu)造函數(shù)中使用默認(rèn)參數(shù)提供了建立對象的多種初始化方法,相當(dāng)于多個重載的構(gòu)造函數(shù);Box(int
=10,int
=10,int
=10);//指定全部參數(shù)為默認(rèn)參數(shù)53//聲明無參構(gòu)造函數(shù),是重載構(gòu)造函數(shù)//聲明有2個參數(shù)的構(gòu)造函數(shù)Box();Box(int,int);若有以下語句:
Box
box1;//無法確定調(diào)用第1個、還是第2個構(gòu)造函數(shù)?Box
box2(15,30);//無法確定調(diào)用第1個、還是第3個構(gòu)造函數(shù)?例2.5.5??截悩?gòu)造函數(shù)54拷貝構(gòu)造函數(shù)是一種特殊的構(gòu)造函數(shù),其形參為本類的對象引用。class
類名{ public
:類名(形參);//構(gòu)造函數(shù)類名(類名&對象名);//拷貝構(gòu)造函數(shù)...};類名::類名(類名&對象名)//拷貝構(gòu)造函數(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)用類的一個對象去初始化該類的另一個對象時系統(tǒng)自動調(diào)用拷貝構(gòu)造函數(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ù)的形參為類對象,調(diào)用函數(shù)時,實參賦值給形參,系統(tǒ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ù)的返回值是類對象時,系統(tǒ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òu)造函數(shù)。這個構(gòu)造函數(shù)執(zhí)行的功能是:用作
為初始值的對象的每個數(shù)據(jù)成員的值,
初始化將要建立的對象的對應(yīng)數(shù)據(jù)成員。構(gòu)造函數(shù)和析構(gòu)函數(shù)析構(gòu)函數(shù)61完成對象被刪除前的一些清理工作。在對象的生存期結(jié)束的時刻系統(tǒng)自動調(diào)用它,然后再釋放此對象所屬的空間。如果程序中未聲明析構(gòu)函數(shù),編譯器將自動產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù)。構(gòu)造函數(shù)和析構(gòu)函數(shù)析構(gòu)函數(shù)62析構(gòu)函數(shù)的作用與構(gòu)造函數(shù)相反。析構(gòu)函數(shù)的特點:析構(gòu)函數(shù)不能接受任何參數(shù),也沒有返回類型說明;一個類只有一個析構(gòu)函數(shù),如果用戶未編寫析構(gòu)函數(shù),編譯系統(tǒng)會自動生成一個缺省的析構(gòu)函數(shù),此函數(shù)不做任何事情;析構(gòu)函數(shù)不能重載。構(gòu)造函數(shù)和析構(gòu)函數(shù)何時執(zhí)行析構(gòu)函數(shù)?63一個函數(shù)中定義的對象(自動局部的),在這個函數(shù)結(jié)束調(diào)用時,對象應(yīng)該釋放,并在對象釋放前自動執(zhí)行析構(gòu)函數(shù);static類型的局部對象在函數(shù)調(diào)用結(jié)束時并不釋放,也不調(diào)用析構(gòu)函數(shù),只在main函數(shù)結(jié)束或調(diào)用exit函數(shù)結(jié)束程序時,才調(diào)用static局部對象的析構(gòu)函數(shù);一個全局對象,在程序離開其作用域時(如main函數(shù)結(jié)束或調(diào)用exit函數(shù)),調(diào)用該全局對象的析構(gòu)函數(shù);用new運算符動態(tài)建立的對象,當(dāng)用delete運算符釋放該對象時,先調(diào)用該對象的析構(gòu)函數(shù);如果用戶沒定義析構(gòu)函數(shù),C++編譯系統(tǒng)會自動生成一個析構(gòu)函數(shù),只是它實際上不執(zhí)行任何操作。例gf9
包含構(gòu)造函數(shù)和析構(gòu)函數(shù)的C++程序。64構(gòu)造函數(shù)和析構(gòu)函數(shù)共同點都沒有返回值,無需指出返回類型;不能被繼承;構(gòu)造函數(shù)可以有缺省參數(shù);不能用常規(guī)調(diào)用方法調(diào)用構(gòu)造函數(shù);當(dāng)
使用完全的限定名(包括對象名、類名、函數(shù)名)時可以調(diào)用析構(gòu)函數(shù);定義對象時,編譯程序自動調(diào)用構(gòu)造函數(shù),刪除對象時,編譯程序自動調(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ù),其對應(yīng)的(同一對象中的)析構(gòu)函數(shù)最后被調(diào)用,而最后被調(diào)用的構(gòu)造函數(shù),其對應(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指針的基本概念對象指針指針可以指向所有對象指針指向變量--指針變量(存變量的地址)指針指向數(shù)組--數(shù)組指針(存數(shù)組的起始地址)指針指向函數(shù)--函數(shù)指針(存放函數(shù)的入口地址)指針指向指針--指針型指針(存放某指針的地址)由指針組成的數(shù)組--指針數(shù)組指針指向結(jié)構(gòu)--結(jié)構(gòu)指針指針指向?qū)ο蟆獙ο笾羔樦羔樖且环N可定位其他對象的特殊類型的數(shù)據(jù)(存放其他對象的首地址)指針是一種可定位其他對象的特殊類型的數(shù)據(jù)(存放其他對象的首地址)指向?qū)ο蟮闹羔?8對象存儲空間的起始地址叫對象指針;可以定義一個指針變量,存放對象空間的起始地址,如:Time
t1;
//創(chuàng)建Time類對象t1Time
*pt=
&t1
;//定義指向Time類對象//的指針pt,并將t1的起始地址賦給pt對象指針指向?qū)ο蟮闹羔?9可以通過對象指針訪問對象和對象的成員,如:*pt(*pt).hour//pt所指向?qū)ο髏1//pt所指向?qū)ο笾械膆our成員,即t1.
hour//pt所指向?qū)ο笾械膆our成員,pt
->
hour即t1.
hour(*pt).get_time()
//調(diào)用pt所指向的對象中的
get_time函數(shù),即t1.
get_timept->get_time()
//調(diào)用pt所指向的對象中的
get_time函數(shù),即t1.
get_time對象指針指向?qū)ο蟪蓡T的指針70指向?qū)ο髷?shù)據(jù)成員的指針:數(shù)據(jù)類型名*指針變量名;
p1=&t1.hour;//將對象t1的數(shù)據(jù)成員hour的地址賦給p1,p1指向t1.
hourcout
<<*p1
<<endl;//輸出t1.
hour的值對象指針指向?qū)ο蟪蓡T的指針71指向?qū)ο蟪蓡T函數(shù)的指針:1、普通函數(shù):數(shù)據(jù)類型名(*指針變量名)(參數(shù)表列);2、指向公用成員函數(shù)的指針變量:數(shù)據(jù)類型名(類::*指針變量名)(參數(shù)表列);3、使指針變量指向一個公用成員函數(shù)的一般形式為:指針變量名=&類名::成員函數(shù)名;例gf17。對象指針this指針72隱含于每一個類的成員函數(shù)中的特殊指針。明確地指出了成員函數(shù)當(dāng)前所操作的數(shù)據(jù)所屬的對象。–當(dāng)通過一個對象調(diào)用成員函數(shù)時,系統(tǒng)先將該對象的地址賦給this指針,然后調(diào)用成員函數(shù),成員函數(shù)對對象的數(shù)據(jù)成員進(jìn)行操作時,就隱含使用了this指針。對象指針this指針73例如:Point類的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 注冊會計師考試2025年企業(yè)資源計劃的重要性試題及答案
- 注冊會計師考試趨勢與應(yīng)對策略分析試題及答案
- 項目合作伙伴選擇的關(guān)鍵考題及答案
- 2025年金融市場概論試題及答案
- 律師事務(wù)所關(guān)于股份有限公司部分國有股權(quán)轉(zhuǎn)讓的法律意見書
- 了解項目管理變革的相關(guān)考題試題及答案
- 新市場開發(fā)的總結(jié)與戰(zhàn)略計劃
- 建立良好的客戶服務(wù)意識計劃
- 2025年注冊會計師考試的突出優(yōu)勢與考生需求分析試題及答案
- 2025年證券從業(yè)資格證基礎(chǔ)盤點試題及答案
- 2024中考英語必考1600詞匯分類速記表
- 小學(xué)語文課程方案2022
- 幼兒園課件:《動物的尾巴》
- Q∕GDW 1572-2014 計量用低壓電流互感器技術(shù)規(guī)范
- 2022年版初中物理課程標(biāo)準(zhǔn)解讀-課件
- 河南省洛陽市新安縣2023-2024學(xué)年八年級下學(xué)期4月期中道德與法治試題
- 2024年建筑業(yè)10項新技術(shù)
- DB11-T 2207-2023 市政橋梁工程數(shù)字化建造標(biāo)準(zhǔn)
- 校園足球教育知識講座
- 2022-2023學(xué)年湖南省長沙市重點中學(xué)高一下學(xué)期期中考試化學(xué)試卷
- 硼元素植物研究報告總結(jié)
評論
0/150
提交評論