版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、 第十四章 靜態(tài)成員與友元 假設(shè)想讓類的一切對(duì)象在類的范圍內(nèi)共享某個(gè)數(shù)據(jù),聲明為static的類成員便能在類范圍中共享,稱之為靜態(tài)成員。15.1 靜態(tài)成員的運(yùn)用 成員有數(shù)據(jù)成員和成員函數(shù)之分,靜態(tài)成員也有靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)之分。靜態(tài)成員用static聲明。 例如,下面的程序在類中定義了一個(gè)靜態(tài)數(shù)據(jù)成員和一個(gè)靜態(tài)成員函數(shù),在它的構(gòu)造函數(shù)和析構(gòu)函數(shù)中對(duì)靜態(tài)數(shù)據(jù)成員進(jìn)展操作,在運(yùn)用程序中,調(diào)用了靜態(tài)成員函數(shù):#include #include class Studentpublic: Student(char* pName =no name) cout create one studentn
2、; strcpy(name, pName); noOfStudents+; /靜態(tài)成員:每創(chuàng)建一個(gè)對(duì)象,學(xué) 生人數(shù)增1 cout noOfStudents endl; Student() cout destruct one studentn; noOfStudents-; /每析構(gòu)一個(gè)對(duì)象,學(xué)生人數(shù)減1 cout noOfStudents endl; static int number() /靜態(tài)成員函數(shù) return noOfStudents; protected: static int noOfStudents; /假設(shè)寫成noOfStudents=0;那么非法 char name40;i
3、nt Student:noOfStudents =0; /靜態(tài)數(shù)據(jù)成員在類外分配空間和初始化void fn() Student s1; Student s2; cout Student:number() endl; /調(diào)用靜態(tài)成員函數(shù)用類名引導(dǎo)void main() fn(); cout Student:number() endl; /調(diào)用靜態(tài)成員函數(shù)用類名引導(dǎo) 數(shù)據(jù)成員noOfStudents,既不是對(duì)象s1也不是對(duì)象s2的一部分。Student類隨著對(duì)象的產(chǎn)生,每個(gè)對(duì)象都有一個(gè)name成員值,但無(wú)論對(duì)象有多少,甚至沒(méi)有,靜態(tài)成員noOfStudents也只需一個(gè)。一切Student對(duì)象都共
4、享它,并且可以訪問(wèn)它。 在Student對(duì)象空間中,是沒(méi)有靜態(tài)數(shù)據(jù)成員noOfStudents的,它的空間分配并不在Student的構(gòu)造函數(shù)里完成,并且空間回收也不在類的析構(gòu)函數(shù)里完成。靜態(tài)數(shù)據(jù)成員在程序開場(chǎng)運(yùn)轉(zhuǎn)時(shí)就存在了。15.2 靜態(tài)數(shù)據(jù)成員 公共靜態(tài)數(shù)據(jù)成員可被類的外部訪問(wèn),維護(hù)或私有靜態(tài)數(shù)據(jù)成員可被類的內(nèi)部訪問(wèn)。 例如,下面的代碼描畫一個(gè)公共的靜態(tài)數(shù)據(jù)成員: class Student public: Student() noOfStudents+; / static int noOfStudents; /公共靜態(tài)數(shù)據(jù)成員 / ; void fn(Student& s1,Stu
5、dent& s2) couts1.noOfStudents; /此處也可以訪問(wèn)靜態(tài)數(shù)據(jù)成員 在類的外部,訪問(wèn)靜態(tài)數(shù)據(jù)成員的方式可以是s1.noOfStudents,它等價(jià)于s2.noOfStudents,更通常的用法是Student:noOfStudents(不能用Student.noOfStudents)。其意義是,靜態(tài)數(shù)據(jù)成員是屬于Student類的,而不是屬于哪個(gè)特定對(duì)象的,它也不需求依賴某個(gè)特定對(duì)象的數(shù)據(jù)。 靜態(tài)數(shù)據(jù)成員用得比較多的場(chǎng)所普通為: (1) 用來(lái)保管流動(dòng)變化的對(duì)象個(gè)數(shù); (2) 作為一個(gè)標(biāo)志,指示一個(gè)特定的動(dòng)作能否發(fā)生; (3) 一個(gè)指向一個(gè)鏈表第一成員或最后一個(gè)成
6、員的指針. 例如,下面的程序描畫一個(gè)學(xué)生類,該類對(duì)象是一個(gè)個(gè)的學(xué)生,它們構(gòu)成一個(gè)單向鏈表: #include #include class Student public: Student(char* pName); Student(); protected: static Student* pFirst; Student* pNext; char name40; ; Student* Student:pFirst =0; Student:Student(char* pName) strncpy(name,pName,sizeof(name); namesizeof(name)-1 =0; pN
7、ext =pFirst; /每新建一個(gè)結(jié)點(diǎn)(對(duì)象),就將其 掛在鏈?zhǔn)?pFirst =this; Student:Student() cout name pNext) if(pS-pNext=this) /找到時(shí),pS指向當(dāng)前結(jié)點(diǎn)的結(jié)點(diǎn) pS-pNext=pNext; /pNext即this-pNext return; Student* fn() Student* pS =new Student(Jenny); Student sb(Jone); return pS;void main() Student sa(Jamsa); Student* sb =fn(); Student sc(Tra
8、cey); delete sb;15.3 靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)定義是類的內(nèi)部實(shí)現(xiàn),屬于類定義的一部分。它的定義位置與普通成員函數(shù)一樣。 與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)與類相聯(lián)絡(luò),不與類的對(duì)象相聯(lián)絡(luò),所以訪問(wèn)靜態(tài)成員函數(shù)時(shí),不需求對(duì)象。假設(shè)用對(duì)象去援用靜態(tài)成員函數(shù),只是用其類型。 例如,下面的程序,兩種調(diào)用靜態(tài)成員函數(shù)的方法都是合法的,而且意義一樣: #include class Student public: static int number() return noOfStudents; /. protected: char name40; static int noOfStuden
9、ts; ; int Student:noOfStudents = 1; void main() Student s; cout s.number() endl; /ok 用對(duì)象援用 靜態(tài)成員函數(shù) cout Student:number() endl; /ok 用類名引導(dǎo)靜態(tài)成員函數(shù) 運(yùn)轉(zhuǎn)結(jié)果為: 1 1 靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是什么? 它們的根本區(qū)別在于靜態(tài)成員函數(shù)沒(méi)有this指針,而非靜態(tài)成員函數(shù)有一個(gè)指向當(dāng)前對(duì)象的指針this。 例如: class Sc public: void nsfn(int a); /像聲明Sc:nsfn(Sc* this,int a); stati
10、c void sfn(int a); /無(wú)this指針 / void f(Sc& s) s.nsfn(10); /轉(zhuǎn)換為Sc:nsfn(&s,10) s.sfn(10); /轉(zhuǎn)換為Sc:sfn(10) 函數(shù)nsfn()可被以為它聲明為void Sc:nsfn(Sc* this,int a)。對(duì)nsfn()的調(diào)用,編譯像注解的那樣進(jìn)展轉(zhuǎn)換,s的地址作為第一個(gè)傳送的參數(shù)。 在函數(shù)內(nèi)部,Sc:nsfn()對(duì)非靜態(tài)成員的訪問(wèn)將自動(dòng)地把this參數(shù)作為指向當(dāng)前對(duì)象的指針。而當(dāng)Sc:sfn()被調(diào)用時(shí),沒(méi)有任何對(duì)象的地址被傳送。15.4 需求友元的緣由 友元函數(shù)完全是普通的C+函數(shù),不同的是,它可以訪問(wèn)類的維護(hù)或私有成員,方便編程,提高了效率,但卻破壞了類的封裝。15.5 友元的運(yùn)用 在類里聲明一個(gè)普通函數(shù),標(biāo)上關(guān)鍵字friend,就
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年專業(yè)土木工程分包協(xié)議樣本
- 污水處理需求分析
- 獸用生物制品的市場(chǎng)前景與投資機(jī)會(huì)
- 鋁單板幕墻施工技術(shù)培訓(xùn)方案
- 邊坡塌陷事故應(yīng)急治理方案
- 配電室火災(zāi)事故應(yīng)急救援方案
- 鋼琴課的課程設(shè)計(jì)
- 學(xué)校防汛應(yīng)急預(yù)案培訓(xùn)計(jì)劃
- 食品課程設(shè)計(jì)題
- 2024不銹鋼文化長(zhǎng)廊制作合同
- 2021EPC總承包各專業(yè)配合以及項(xiàng)目組織架構(gòu)
- 抗炎免疫藥物的研究進(jìn)展課件
- 兒童液體療法以及護(hù)理
- 《心中的“110”》PPT課件
- 現(xiàn)澆箱梁冬季施工專項(xiàng)方案
- 多晶硅生產(chǎn)工藝培訓(xùn)課件(共56頁(yè)).ppt
- 辯論賽教案(Word)
- 生物入侵及其危害 (共20張PPT)
- 統(tǒng)編語(yǔ)文一上《江南》課例點(diǎn)評(píng)
- 《一元二次方程》(復(fù)習(xí)課)說(shuō)課稿
- 嘉應(yīng)學(xué)院園林生態(tài)學(xué)實(shí)驗(yàn)指導(dǎo)書
評(píng)論
0/150
提交評(píng)論