6.1 類的定義
考點(diǎn)1 類的定義
C++語言的類是一種用戶自己定義的數(shù)據(jù)類型,和其他的數(shù)據(jù)類型不同的地方是組成這種類型的不僅可以有數(shù)據(jù)還可以有對數(shù)據(jù)進(jìn)行操作的函數(shù),它們分別叫做類的數(shù)據(jù)成員和類的函數(shù)成員。類是面向?qū)ο蟪绦蛟O(shè)計的核心,數(shù)據(jù)封裝就是通過類來實(shí)現(xiàn)的。
類是對一組性質(zhì)相同對象的描述。類的定義形式一般分為說明部分和實(shí)現(xiàn)部分。說明部分是用來說明該類中的成員,實(shí)現(xiàn)部分是用來對成員函數(shù)的定義。類的一般定義形式為:
class<類名>
{
private:
<私有的數(shù)據(jù)和函數(shù)>
public:
<公有的數(shù)據(jù)和函數(shù)>
protected:
<保護(hù)的數(shù)據(jù)和函數(shù)>
};
<各個成員函數(shù)的實(shí)現(xiàn)>
其中,類定義以關(guān)鍵字class開始,其后跟類名,類名必須是一個有效的C++標(biāo)識符。
類所說明的內(nèi)容用花括號括起來,右花括號后的分號的作用是類說明語句的結(jié)束標(biāo)志。“{}”之間的內(nèi)容稱為類體。關(guān)鍵字private,public和protected稱為訪問權(quán)限修飾符或訪問控制修飾符,它們用于限制類成員的控制訪問范圍,如果沒有使用多,則所有成員默認(rèn)定義為private權(quán)限。這些關(guān)鍵字的聲明順序和次數(shù)都是任意的。<各個成員函數(shù)的實(shí)現(xiàn)>是類定義中的實(shí)現(xiàn)部分,這部分包含所有在類體內(nèi)說明的成員函數(shù)的定義。各個成員函數(shù)的實(shí)體內(nèi)類體內(nèi)定義,又可以在類體外定義。如果一個成員函數(shù)在類體內(nèi)定義,實(shí)現(xiàn)部分將不出現(xiàn);如果所有的成員數(shù)都在類體內(nèi)定義,則實(shí)現(xiàn)部分可以省略在類體內(nèi)定義的成員函數(shù)都是內(nèi)聯(lián)函數(shù)。
小提示:
C++規(guī)定任何數(shù)據(jù)類型都必須先定義后使用,類也不例外。
考點(diǎn)2 類成員的訪問控制
類成員均具有一個屬性,叫做訪問控制權(quán)限。所以從訪問權(quán)限上來講,類的成員又分為私有的(private),公有的(public)和保護(hù)的( protected) 3類。公有成員定義了類的外部接口,只有公有成員才能被用戶程序直接訪問;私有成員定義了類的內(nèi)部使用的數(shù)據(jù)和函數(shù),私有成員只能被自己所屬類的成員函數(shù)及友元函數(shù)訪問;保護(hù)成員存取權(quán)限介于公有成員和私有成員之間,它在類的繼承和派生中使用。
小提示:
一個類可以沒有私有成員,但是不能沒有公有成員。
考點(diǎn)3 類的數(shù)據(jù)成員和類的函數(shù)成員
1.類的數(shù)據(jù)成員
數(shù)據(jù)成員是類的一個重要組成部分,它描述了對象的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。類的數(shù)據(jù)成員是類的基礎(chǔ),應(yīng)該正確、完整地定義類的數(shù)據(jù)成員。定義類的數(shù)據(jù)成員應(yīng)注意:
(1)在類體中不允許對所定義的數(shù)據(jù)成員進(jìn)行初始化。
(2)類中的數(shù)據(jù)成員的類型可以是任意的,包含整型、浮點(diǎn)型、字符型、數(shù)組、 指針和引用等,也可以是對象。另一個類的對象可以作為該類的成員,但是自身類的對象是不可以的,而自身類的指針或引用則是可以的。當(dāng)一個類的對象作為這個類的成員時,如果另一個類的定義在后,則需要提前說明。
2.類的函數(shù)成員
函數(shù)成員實(shí)現(xiàn)對類中數(shù)據(jù)成員的操作,它描述了類的行為。由于對象的封裝性,類的函數(shù)成員是對類的私有數(shù)據(jù)成員進(jìn)行操作的惟一途徑。類中所有的函數(shù)成員都必須在類體中說明,但函數(shù)成員的定義既可在類體內(nèi),也可在類體外。
(1)在類體內(nèi)直接給出函數(shù)的定義。例如,下面是在類體內(nèi)給出類成員函數(shù)實(shí)現(xiàn)的例子:
class Shijian{
private:
int Shi,F(xiàn)en,Miao;
public:
void Set(int S, int F, int M)//可省略此成員函數(shù)的變量標(biāo)識符
{Shi=S;
Fen=F;
Miao=M;}
void Display(){
cout<<"現(xiàn)在時間是:";
cout<<Shi<<":"<<Fen":"<<Miao;
}
};
(2)在類體外給出函數(shù)的定義。定義形式如下:
<返回類型><類名>::<成員函數(shù)名>(<參數(shù)表>)
{<成員函數(shù)體>}
成員函數(shù)定義的結(jié)構(gòu)與普通函數(shù)不同之處是在返回類型和函數(shù)名之間加了一個類名和雙冒號“::”。::是作用域運(yùn)算符,用來標(biāo)識成員函數(shù)或數(shù)據(jù)成員是屬于哪個類的實(shí)理成員函數(shù)時參數(shù)表中的形參變量標(biāo)識符可以省略。例如,實(shí)現(xiàn)上例中的成員函數(shù)Diaplay():
void Shijian::Disptay()
{cout<<"現(xiàn)在時間是:";
cout<<Shi<<":"<<Fen":"<<Miao;}
另外,類成員函數(shù)同普通函數(shù)一樣,也可以進(jìn)行重載及其默認(rèn)參數(shù)。
小提示:
類的每個成員函數(shù)在說明中最后的分號不可省略,但在類體內(nèi)實(shí)現(xiàn)時省略分號。
6.2 對象的定義
考點(diǎn)4 對象的定義
類名僅提供該類的類型定義,只有在定義屬于類的變量后,系統(tǒng)才會在內(nèi)存預(yù)留空間。
對象是類的實(shí)例,是由類作為類型定義的變量。定義對象之前一定要先說明該對象的類。定義一個對象同定義一個變量類似,其語法形式為:
<類名><對象名表>(<參數(shù)表>);
其中,<對象名表>中可以有一個或多個對象名,有多個對象名時用逗號分隔。<對象名表>中還可以是指向?qū)ο蟮闹羔樏蛞妹部梢允菍ο髷?shù)組名。<參數(shù)表>是進(jìn)行初始化對象時需要的。
考點(diǎn)5 對象的成員
用類定義了對象以后,對象就具有了類的所有性質(zhì)。也就是說一個對象成員包含了該對象的類所定義的所有數(shù)據(jù)成員和函數(shù)成員。訪問一般對象和引用對象可以用"."運(yùn)算符;訪問指針對象可以用->。一般對象的數(shù)據(jù)成員表示形式為:
<對象名>.<成員名>
一般對象的函數(shù)成員表示形式為:
<對象名><成員名>(<參數(shù)表>)
指向?qū)ο蟮闹羔樀某蓡T表示形式為:
<對象指針名>一><成員名>(表示數(shù)據(jù)成員)
上述形式也可寫成:(*<對象指針名>).<成員名>
<對象指針名>一><成員名>(<參數(shù)表>)(表示函數(shù)成員)
6.3 構(gòu)造函數(shù)與析構(gòu)函數(shù)
考點(diǎn)6 構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義
構(gòu)造函數(shù)和析構(gòu)函數(shù)是在類體中說明的兩種特殊的成員函數(shù)。構(gòu)造函數(shù)的功能是在創(chuàng)建對象時利用特定的值構(gòu)造對象,將對象初始化為一個特定的狀態(tài),使此對象具有區(qū)別于其他對象的特征。析構(gòu)函數(shù)的功能是用來釋放一個對象,在對象刪除前,用它來做一些清理工作,與構(gòu)造函數(shù)的功能正好相反。構(gòu)造函數(shù)和析構(gòu)函數(shù)都沒有返回值,并且定義它們時不需要顯式地寫出沒有返回值。構(gòu)造函數(shù)可以帶參數(shù),也可以重載;而析構(gòu)函數(shù)不能有參數(shù),也不能重載。
構(gòu)造函數(shù)的特點(diǎn):
(1)構(gòu)造函數(shù)是特殊的成員函數(shù),函數(shù)體可以寫在類體內(nèi),也可以寫在類體外。該函數(shù)的名字與類名相同,該函數(shù)不能指定返回類型。
(2)構(gòu)造函數(shù)一般都被聲明為公有函數(shù)。構(gòu)造函數(shù)可以重載,即可以定義多個參數(shù)個數(shù)不同或參數(shù)類型不同的構(gòu)造函數(shù)。
(3)構(gòu)造函數(shù)在定義對象時被系統(tǒng)直接調(diào)用,程序中不能直接調(diào)用構(gòu)造函數(shù)。
(4)應(yīng)用構(gòu)造函數(shù)定義對象的語法形式為:
<類名><對象名>(<構(gòu)造函數(shù)的參數(shù)表>);
(5)運(yùn)算符new和構(gòu)造函數(shù)一起使用。
析構(gòu)函數(shù)的特點(diǎn):
(1) 析構(gòu)函數(shù)是特殊的成員函數(shù),函數(shù)體可以寫在類體內(nèi),也可寫在類體外。該函數(shù)的名字為求反符號“~”后面跟著類名,該函數(shù)不能指定返回類型,不能有參數(shù),也不能重載。
(2)一個類只能定義一個析構(gòu)函數(shù)。
(3)析構(gòu)函數(shù)在對象生命周期結(jié)束時被系統(tǒng)直接調(diào)用,程序中一般不調(diào)用析構(gòu)函數(shù)。
(4)運(yùn)算符delete與析構(gòu)函數(shù)一起使用。
考點(diǎn)7 默認(rèn)構(gòu)造函數(shù)和默認(rèn)析構(gòu)函數(shù)
1.默認(rèn)構(gòu)造函數(shù)
不帶參數(shù)的構(gòu)造函數(shù)又稱為默認(rèn)構(gòu)造函數(shù),當(dāng)沒有為一個類定義任何構(gòu)造函數(shù)的情況下,C++編譯器總要自動建立一個不帶參數(shù)的構(gòu)造函數(shù)。它的定義形式為:
<類名>::<類名>()
{
}
即它的函數(shù)體是空的。默認(rèn)構(gòu)造函數(shù)的函數(shù)名與類名相同,它的參數(shù)表或?yàn)榭栈蛩械膮?shù)都有默認(rèn)值。
2默認(rèn)析構(gòu)函數(shù)
每個對象都有一個析構(gòu)函數(shù),如果在定義一個類時沒有定義一個析構(gòu)函數(shù),C++編譯器要為這個類產(chǎn)生一個默認(rèn)的析構(gòu)函數(shù)。它的定義形式為:
<類名>::<類名>()
{
}
函數(shù)體也是空的。
考點(diǎn)8 拷貝(復(fù)制)構(gòu)造函數(shù)
拷貝構(gòu)造函數(shù)是一個特殊的構(gòu)造函數(shù),具有一般構(gòu)造函數(shù)的所有特性,它只有一個參數(shù),參數(shù)類型是本類對象的引用。它的功能是用一個已知的對象來初始化一個被創(chuàng)建的同類的對象。拷貝構(gòu)造函數(shù)的一般形式為:
<類名>::<拷貝構(gòu)造函數(shù)名>(const<類名>&<引用對象名>)
{//拷貝構(gòu)造函數(shù)體}
其中,<拷貝構(gòu)造函數(shù)名>與類名相同,因?yàn)榭截悩?gòu)造函數(shù)也是一種構(gòu)造函數(shù)???br>貝構(gòu)造函數(shù)也不被指定返回類型。每一個類都必須有一個拷貝構(gòu)造函數(shù)。如果類中沒有聲明拷貝構(gòu)造函數(shù),則編譯系統(tǒng)自動生成一個具有上述形式的公有的拷貝構(gòu)造函數(shù),作為該類的公有成員。
普通構(gòu)造函數(shù)只在對象創(chuàng)建時被自動調(diào)用,而拷貝構(gòu)造函數(shù)可以在下面3種情況下被自動調(diào)用。
(l)用類的已知對象定義該類的一個正在被創(chuàng)建的對象。
(2)對象作為函數(shù)的實(shí)參傳遞給函數(shù)形參
(3)對象作為函數(shù)返回值。
6.4 對象的生存周期
考點(diǎn)9 全局對象、靜態(tài)對象與局部對象
對象從被創(chuàng)建開始到被釋放為止的這段時間稱為對象的生存周期。根據(jù)對象的生存周期可將對象分為3類。
(1)全局對象。全局對象的作用域最大,生存周期最長。調(diào)用構(gòu)造函數(shù)創(chuàng)建該對象的時間是當(dāng)程序開始執(zhí)行時;調(diào)用析構(gòu)函數(shù)釋放該對象的時間是當(dāng)程序結(jié)束時。
(2) 靜態(tài)對象。靜態(tài)對象的作用域和生存周期處在全局對象和局部對象之間。調(diào)用構(gòu)造函數(shù)創(chuàng)建該對象時間是當(dāng)程序第一次執(zhí)行到該對象的定義之處時;調(diào)用析構(gòu)函數(shù)釋放該對象的時間是當(dāng)程序結(jié)束時。
(3)局部對象。局部對象的作用域最小,生存周期最短。調(diào)用構(gòu)造函數(shù)創(chuàng)建該對象的時間是當(dāng)程序執(zhí)行到該對象的定義之處時;調(diào)用析構(gòu)函數(shù)釋放該對象的時間是當(dāng)程序退出定義該對象聽在的函數(shù)體或程序塊時。
考點(diǎn)10 自由存儲對象
所謂自由存儲對象是指在程序運(yùn)行過程中根據(jù)需要可以隨時建立或刪除的對象由堆運(yùn)算符new和delete 來完成建立和刪除的工作。自由存儲對象在調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)時需要注意的是:此時的調(diào)用是顯示地進(jìn)行,調(diào)用順序取決于new和delete運(yùn)算符的順序。
6.5 this指針
考點(diǎn)11 this指針的使用
C++規(guī)定,this指針是隱含在對象成員函數(shù)內(nèi)的一種指針。當(dāng)一個對象被創(chuàng)建后,它的每一個成員函數(shù)都含有一個系統(tǒng)自動生成的隱含指針――this,用以保存這個對象的地址。因此this也稱為“指向本對象的指針”,它存取類成員變量的格式為:
this-><成員變量>
this指針是C++實(shí)現(xiàn)封裝的一種機(jī)制,它將對象和該對象調(diào)用的成員函數(shù)連接在一起,在外部看來,每一個對象都擁有自己的函數(shù)成員。一般情況下,并不寫this,而是讓系統(tǒng)進(jìn)行默認(rèn)設(shè)置。
小提示:
this指針永遠(yuǎn)指向當(dāng)前對象。
6. 6 靜態(tài)成員和常成員
考點(diǎn)12 靜態(tài)數(shù)據(jù)成員
如果類的數(shù)據(jù)成員或成員函數(shù)使用關(guān)鍵字static進(jìn)行修飾,這樣的成員稱為靜態(tài)數(shù)據(jù)成員或靜態(tài)成員函數(shù)。靜態(tài)數(shù)據(jù)成員是類的所有對象的共享成員,而不是某個對象的成員。靜態(tài)數(shù)據(jù)成員的值對每個對象都是一樣的,但它的值是可以更新的。靜態(tài)數(shù)據(jù)成員的使用方法和注意事項如下:
(l)靜態(tài)數(shù)據(jù)成員在定義或說明時前面加關(guān)鍵字static o
(2)靜態(tài)數(shù)據(jù)成員必須進(jìn)行初始化,而且它的初始化與一般的數(shù)據(jù)成員初始化不同。它的初始化格式為:
<數(shù)據(jù)類型><類名>::<靜態(tài)數(shù)據(jù)成員名>=<值>;
從而可知:初始化在類體外進(jìn)行,而前面不加static,以免與一般靜態(tài)變量或?qū)ο笙嗷煜?;初始化時不加該成員的訪問權(quán)限控制符;初始化時使用作用域運(yùn)算符來標(biāo)明它所屬的類,所以,靜態(tài)數(shù)據(jù)成員是類的成員,而不是對象的成員。
(3)如果靜態(tài)數(shù)據(jù)成員的訪問權(quán)限允許的話(即為public成員),可在程序中按下面形式來引用靜態(tài)數(shù)據(jù)成員。形式為:
<類名>::<靜態(tài)數(shù)據(jù)成員>
考點(diǎn)13 靜態(tài)成員函數(shù)
靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,都屬于類的靜態(tài)成員,它們都不是對象的成員。所以,對靜態(tài)成員的引用不需要用對象名。在靜態(tài)成員函數(shù)的實(shí)現(xiàn)中不能直接引用類中說明的非靜態(tài)成員,但可以引用類中說明的靜態(tài)成員。若靜態(tài)成員函數(shù)中要引用非靜態(tài)成員時,則可通過對象來引用。在類體外定義靜態(tài)成員函數(shù)時,不使用static。在main()函數(shù)中,調(diào)用靜態(tài)成員函數(shù)的形式為:
<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>)
考點(diǎn)14 常對象
所謂常對象就是指使用關(guān)鍵字const修飾的對象。也可以叫做const對象。一般,能作用于const對象的函數(shù)只有構(gòu)造函數(shù)與析構(gòu)函數(shù),因?yàn)閏onst對象被看做只能生成與撤銷、而不能被訪問的對象。常對象在定義時必須進(jìn)行初始化,并且不能被更新。常對象的定義形式為:
<類名>const<對象名>
或const<類名><對象名>
考點(diǎn)15 常成員函數(shù)和常數(shù)據(jù)成員
1.常成員函數(shù)
所謂常成員函數(shù)就是指使用關(guān)鍵字const聲明的成員函數(shù)。常成員函數(shù)的聲明形式為:
<返回類型><成員函數(shù)名>(<參數(shù)表>)const;
const也是類型的一部分,在const成員函數(shù)的定義與聲明時都要寫上。常對象和一般對象都可以調(diào)用常成員函數(shù),而一般成員函數(shù)只能由一般對象調(diào)用。
2.常數(shù)據(jù)成員
所謂常數(shù)據(jù)成員就是指使用關(guān)鍵字const聲明的數(shù)據(jù)成員。常數(shù)據(jù)成員的定義形式與一般常量的定義形式相同,只不過常數(shù)據(jù)成員的定義必須出現(xiàn)在類體中。常數(shù)據(jù)成員必須進(jìn)行初始化,并且不能被更新。常數(shù)據(jù)成員只能通過構(gòu)造函數(shù)的成員初始化列表進(jìn)行初始化。
6.7 友元
考點(diǎn)16 友元函數(shù)和友元類
1.友元函數(shù)
友元可以是一個函數(shù),也可以是一個類,前者稱為友元函數(shù),后者稱為友元類。友元函數(shù)是一種定義在類外部的普通函數(shù),但它需要在類體內(nèi)進(jìn)行說明,為了與該類的成員函數(shù)加以區(qū)別,在說明時前面要加關(guān)鍵friend。友元函數(shù)不是成員函數(shù),但是它可以訪問類中的聽有成員友兀函數(shù)提高了程序的運(yùn)行效率,但也破壞了類的封裝性和隱藏性,使得非成員函數(shù)可以訪問類的私有成員友元函數(shù)常常是另一個類的一個成員函數(shù),這樣通過友元函數(shù)可以使一個類對象直接訪問另一個類對象的私有成員。友元函數(shù)作為一個類成員函數(shù)時,除了應(yīng)在它所在的類定義中聲明之外,還應(yīng)在另一個類中聲明它的友元關(guān)系,聲明格式為:
friend<函數(shù)返回類型><函數(shù)所在類名>::<函數(shù)名>(<參數(shù)表>
2.友元類
友元類是指將一個類聲明為另一個類的友元也就是當(dāng)一個類作為另一個類的友元時,這個類的所有成員函數(shù)都是另一個類的友元函數(shù)。
小提示:
友元關(guān)系聲明可以出現(xiàn)在類的私有部分,也可以出現(xiàn)在公有部分;友元關(guān)系是單句的,并且只在兩個類之間有效。
6.8 對象數(shù)組與對象成員
考點(diǎn)17 對象數(shù)組
所謂對象數(shù)組是指數(shù)組元素為對象的數(shù)組,對象數(shù)組中的每個元素都是同一類的對象。
對象數(shù)組的定義為:
<類名><數(shù)組名>[<大小>]…
訪問對象數(shù)組成員的一般形式為:
<數(shù)組名>[<下標(biāo)>].<成員名>
小提示:
當(dāng)對象數(shù)組生命周期結(jié)束之后,C++系統(tǒng)為對象數(shù)組的每個元素調(diào)用一次析構(gòu)函數(shù)。
考點(diǎn)18 對象成員
可以在一個類中說明具有類的類型的數(shù)據(jù)成員,這些成員稱為對象成員。說明對象成員的一般形式為:
class<類名>{
<類名1> <對象成員名1>
<類名2> <對象成員名2>
…
<類名n> <對象成員名n>
};
當(dāng)類中有對象成員時,該類的構(gòu)造函數(shù)要調(diào)用這些對象成員所在類的構(gòu)造函數(shù),并采用成員初始化列表的方法為對象成員進(jìn)行初始化。該類的構(gòu)造函數(shù)的定義形式為:
<類名>::<類名>(<總形參表>):<對象成員名1>(<形參表1>),<對象成員名2>(<形參表2>),…<對象成員名n>(<形參表n>)
{
//類成員的初始化
}
對對象成員的構(gòu)造函數(shù)的調(diào)用順序取決于這些對象成員在類中說明的順序,與它們在成員初始化列表中給出的順序無關(guān)。析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)正好相反。
6.9 類模板
考點(diǎn)19 類模板的定義和使用方式
函數(shù)模板和類模板統(tǒng)稱為模板。對象是類的特例,類也可以看做類模板的特例。與函數(shù)模板一樣,使用類模板可以為類定義一種模式,使得類中的某些數(shù)據(jù)成員、某些成員函數(shù)的參數(shù)、某些成員函數(shù)的返回值能取任意類型(包括系統(tǒng)定義的和用戶定義的)但函數(shù)模板與類模板也有許多不同,主要是對由函數(shù)模板生成的模板函數(shù)的調(diào)用是由編譯器自動決定的,而對類模板的解釋由程序設(shè)計者自行指明。類模板使用時需要注意的幾點(diǎn):
(1)定義一個類模板時,必須以關(guān)鍵字template開始,后面是尖括號括起來的類型形參列表,然后是類聲明:
template<class Type>
class類名{…};
(2)每一個類模板的成員函數(shù)的外部定義必須以類型形參開始,此外還應(yīng)加上函數(shù)類型返回值、類范圍、函數(shù)名和形參列表:
template<class Type>
<函數(shù)返回類型><類名><Type>::<函數(shù)名>(<Type temp>)
{
//函數(shù)體
};
(3)類模板是類的抽象類型,它的實(shí)例化是生成一個具體的類,形式如下:
<類名><模板實(shí)參表><對象名>;
或<類名><模板實(shí)參表><對象名>(<構(gòu)造函數(shù)實(shí)參表>);
小提示:
模板一經(jīng)實(shí)例化,便可以且其創(chuàng)建對象。