資源描述:
《第10章 靜態(tài)成員與友元.ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、第10章靜態(tài)成員與友元10.1靜態(tài)成員10.2友元10.3友元應(yīng)用實(shí)例靜態(tài)成員是指聲明為static的類成員在類的范圍內(nèi)所有對(duì)象共享某個(gè)數(shù)據(jù)。友元是一種定義在類外部的普通函數(shù),但它需要在類的內(nèi)部進(jìn)行說(shuō)明,為了與該類的成員函數(shù)加以區(qū)別,在說(shuō)明時(shí)前面加上關(guān)鍵字friend。友元不是成員函數(shù),但它可以訪問類中的私有成員。其作用是提高程序的運(yùn)行效率。C++語(yǔ)言中的友元函數(shù)為在類外訪問類中的私有成員和保護(hù)成員提供了方便,但破壞了類的封裝性和隱蔽性。友元可以是一個(gè)函數(shù),稱為友元函數(shù),也可以是一個(gè)類,稱為友元類。友元函數(shù)和友元類統(tǒng)稱為友元。10.1靜態(tài)成員類相當(dāng)于一個(gè)數(shù)據(jù)類型,當(dāng)說(shuō)明一個(gè)某類
2、的對(duì)象時(shí),系統(tǒng)就為該對(duì)象分配一塊內(nèi)存單元來(lái)存放類中的所有成員。但在某些應(yīng)用中,需要程序中屬于某個(gè)類的所有對(duì)象共享某個(gè)數(shù)據(jù)。為此,一個(gè)解決的辦法就是將所要共享的數(shù)據(jù)說(shuō)明為全局變量,但這將破壞數(shù)據(jù)的封裝性;較好的解決辦法是將所要共享的數(shù)據(jù)說(shuō)明為類的靜態(tài)成員。10.1.1靜態(tài)數(shù)據(jù)成員C++中,同一個(gè)類定義多個(gè)對(duì)象時(shí),每個(gè)對(duì)象擁有各自的數(shù)據(jù)成員(不包括靜態(tài)數(shù)據(jù)成員),而所有對(duì)象共享一份成員函數(shù)和一份靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員是類的所有對(duì)象中共享的成員,而不是某個(gè)對(duì)象的成員,因此可以實(shí)現(xiàn)多個(gè)對(duì)象間的數(shù)據(jù)共享。靜態(tài)數(shù)據(jù)成員不屬于任何對(duì)象,它不因?qū)ο蟮慕⒍a(chǎn)生,也不因?qū)ο蟮奈鰳?gòu)而刪除,它是
3、類定義的一部分,所以使用靜態(tài)數(shù)據(jù)成員不會(huì)破壞類的隱蔽性。對(duì)靜態(tài)數(shù)據(jù)成員的操作和一般數(shù)據(jù)成員一樣,定義為私有的靜態(tài)數(shù)據(jù)成員不能由外界訪問。靜態(tài)數(shù)據(jù)成員可由任意訪問權(quán)限許可的函數(shù)訪問??梢栽陬惖某蓡T函數(shù)中改變靜態(tài)數(shù)據(jù)成員。靜態(tài)數(shù)據(jù)成員不從屬于任何一個(gè)具體對(duì)象,所以必須對(duì)它初始化,且對(duì)它的初始化不能在構(gòu)造函數(shù)中進(jìn)行。類中用關(guān)鍵字static修飾的數(shù)據(jù)成員叫做靜態(tài)數(shù)據(jù)成員。說(shuō)明一個(gè)靜態(tài)數(shù)據(jù)成員的方法與說(shuō)明一個(gè)一般靜態(tài)變量一樣,只不過(guò)前者是在一個(gè)類中說(shuō)明。靜態(tài)數(shù)據(jù)成員的使用方法如下:(1)靜態(tài)數(shù)據(jù)成員的定義與一般數(shù)據(jù)成員相似,但前面要加上static關(guān)鍵詞。(2)靜態(tài)數(shù)據(jù)成員的初始化與一
4、般數(shù)據(jù)成員不同,靜態(tài)數(shù)據(jù)成員初始化的格式如下:<類型><類名>::<靜態(tài)數(shù)據(jù)成員>=<值>;(3)在引用靜態(tài)數(shù)據(jù)成員時(shí)采用格式:<類名>::<靜態(tài)數(shù)據(jù)成員>classClass1{inta;staticintb;//…}c1,c2;intClass1::b;類Class1中包含兩個(gè)數(shù)據(jù)成員a和b,其中a為一般數(shù)據(jù)成員,在對(duì)象c1和c2中都存在有各自的該數(shù)據(jù)成員的副本;而b是靜態(tài)數(shù)據(jù)成員,所有類Class1的對(duì)象中的該成員實(shí)際上是同一個(gè)變量。C++編譯器將靜態(tài)數(shù)據(jù)成員存放在靜態(tài)存儲(chǔ)區(qū),該存儲(chǔ)區(qū)中的所有數(shù)據(jù)為類的所有對(duì)象所共享。10.1.2靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)的定義和其他成員函
5、數(shù)一樣。但在說(shuō)明時(shí)需注意靜態(tài)成員函數(shù)不得說(shuō)明為虛函數(shù)。靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員類似,也是從屬于類,靜態(tài)成員函數(shù)的定義是在一般函數(shù)定義前加上static關(guān)鍵字。調(diào)用靜態(tài)成員函數(shù)的格式如下:<類名>::<靜態(tài)成員函數(shù)名>(<參數(shù)表>);靜態(tài)成員函數(shù)與靜態(tài)數(shù)據(jù)成員一樣,與類相聯(lián)系,不與對(duì)象相聯(lián)系,只要類存在,靜態(tài)成員函數(shù)就可以使用,所以訪問靜態(tài)成員函數(shù)時(shí)不需要對(duì)象。如果用對(duì)象去調(diào)用靜態(tài)成員函數(shù),只是用其類型。靜態(tài)成員函數(shù)只能訪問靜態(tài)數(shù)據(jù)成員、靜態(tài)成員函數(shù)和類以外的函數(shù)和數(shù)據(jù),不能訪問類中的非靜態(tài)數(shù)據(jù)成員(因?yàn)榉庆o態(tài)數(shù)據(jù)成員只有對(duì)象存在時(shí)才有意義)。但靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)可由任
6、意訪問權(quán)限許可的函數(shù)訪問。和一般成員函數(shù)類似,靜態(tài)成員函數(shù)也有訪問限制,私有靜態(tài)成員函數(shù)不能由外界訪問。靜態(tài)成員函數(shù)沒有this指針,因此,靜態(tài)成員函數(shù)只能直接訪問類中的靜態(tài)成員,若要訪問類中的非靜態(tài)成員時(shí),必須借助對(duì)象名或指向?qū)ο蟮闹羔槨?0.2友元友元提供了在不同類的成員函數(shù)之間、類的成員函數(shù)與一般函數(shù)之間進(jìn)行數(shù)據(jù)共享的機(jī)制。通過(guò)友元,一個(gè)普通函數(shù)或另一個(gè)類中的成員函數(shù)可以訪問類中的私有成員和保護(hù)成員。友元的正確使用能提高程序的運(yùn)行效率,但破壞了類的封裝性和數(shù)據(jù)的隱蔽性。10.2.1友元函數(shù)定義友元函數(shù)的方式是在類定義中用關(guān)鍵詞friend說(shuō)明該函數(shù),其格式如下:frien
7、d<類型><友元函數(shù)名>(<參數(shù)表>);友元函數(shù)說(shuō)明的位置可在類的任何部位,既可在public區(qū),也可在protected區(qū),意義完全一樣。友元函數(shù)定義則在類的外部,一般與類的成員函數(shù)定義放在一起。類的友元函數(shù)可以直接訪問該類的所有成員,但它不是成員函數(shù),可以像普通函數(shù)一樣在任何地方調(diào)用。友員函數(shù)的定義方法是在類的任何地方象定義其他函數(shù)一樣定義該函數(shù),并在其前面加上關(guān)鍵字friend即可。友員函數(shù)雖然在類內(nèi)定義,但它不是這個(gè)類的成員函數(shù),它可以是一個(gè)普通函數(shù),也可以是其他類的成員函數(shù),在其函