




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、C語言程序設(shè)計,第十四章 靜態(tài)成員與友元,如果想讓類的所有對象在類的范圍內(nèi)共享某個數(shù)據(jù),聲明為static的類成員便能在類范圍中共享,稱之為靜態(tài)成員。 15.1 靜態(tài)成員的使用 成員有數(shù)據(jù)成員和成員函數(shù)之分,靜態(tài)成員也有靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)之分。靜態(tài)成員用static聲明。 例如,下面的程序在類中定義了一個靜態(tài)數(shù)據(jù)成員和一個靜態(tài)成員函數(shù),在它的構(gòu)造函數(shù)和析構(gòu)函數(shù)中對靜態(tài)數(shù)據(jù)成員進(jìn)行操作,在應(yīng)用程序中,調(diào)用了靜態(tài)成員函數(shù): #include #include,class Student public: Student(char* pName =no name) cout create on
2、e studentn; strcpy(name, pName); noOfStudents+; /靜態(tài)成員:每創(chuàng)建一個對象,學(xué) 生人數(shù)增1 cout noOfStudents endl; Student() cout destruct one studentn; noOfStudents-; /每析構(gòu)一個對象,學(xué)生人數(shù)減1 cout noOfStudents endl;,static int number() /靜態(tài)成員函數(shù) return noOfStudents; protected: static int noOfStudents; /若寫成noOfStudents=0;則非法 char
3、name40; ; int 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,既不是對象s1也不是對象s2的一部分。Student類隨著對象的產(chǎn)生,每個對象都有一個name成員值,但無論對象有多少,甚至沒有,靜態(tài)成員noOfStudents也只有一個。
4、所有Student對象都共享它,并且能夠訪問它。 在Student對象空間中,是沒有靜態(tài)數(shù)據(jù)成員noOfStudents的,它的空間分配并不在Student的構(gòu)造函數(shù)里完成,并且空間回收也不在類的析構(gòu)函數(shù)里完成。靜態(tài)數(shù)據(jù)成員在程序開始運行時就存在了。 15.2 靜態(tài)數(shù)據(jù)成員 公共靜態(tài)數(shù)據(jù)成員可被類的外部訪問,保護(hù)或私有靜態(tài)數(shù)據(jù)成員可被類的內(nèi)部訪問。 例如,下面的代碼描述一個公共的靜態(tài)數(shù)據(jù)成員,class Student public: Student() noOfStudents+; / static int noOfStudents; /公共靜態(tài)數(shù)據(jù)成員 /,void fn(Student
5、/此處也可以訪問靜態(tài)數(shù)據(jù)成員 在類的外部,訪問靜態(tài)數(shù)據(jù)成員的形式可以是s1.noOfStudents,它等價于s2.noOfStudents,更通常的用法是Student:noOfStudents(不能用Student.noOfStudents)。其意義是,靜態(tài)數(shù)據(jù)成員是屬于Student類的,而不是屬于哪個特定對象的,它也不需要依賴某個特定對象的數(shù)據(jù)。 靜態(tài)數(shù)據(jù)成員用得比較多的場合一般為,1) 用來保存流動變化的對象個數(shù); (2) 作為一個標(biāo)志,指示一個特定的動作是否發(fā)生; (3) 一個指向一個鏈表第一成員或最后一個成員的指針. 例如,下面的程序描述一個學(xué)生類,該類對象是一個個的學(xué)生,它們構(gòu)
6、成一個單向鏈表: #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; pNext =pFirst; /每新建一個結(jié)點(對象),就將其 掛在鏈?zhǔn)?pFir
7、st =this;,Student:Student() cout name pNext) if(pS-pNext=this) /找到時,pS指向當(dāng)前結(jié)點的結(jié)點 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(Tracey); delete sb;,15.3 靜態(tài)成員函數(shù) 靜態(tài)成員函數(shù)定義是
8、類的內(nèi)部實現(xiàn),屬于類定義的一部分。它的定義位置與一般成員函數(shù)一樣。 與靜態(tài)數(shù)據(jù)成員一樣,靜態(tài)成員函數(shù)與類相聯(lián)系,不與類的對象相聯(lián)系,所以訪問靜態(tài)成員函數(shù)時,不需要對象。如果用對象去引用靜態(tài)成員函數(shù),只是用其類型。 例如,下面的程序,兩種調(diào)用靜態(tài)成員函數(shù)的方法都是合法的,而且意義一樣: #include class Student public,static int number() return noOfStudents; /. protected: char name40; static int noOfStudents; ; int Student:noOfStudents = 1; vo
9、id main() Student s; cout s.number() endl; /ok 用對象引用 靜態(tài)成員函數(shù) cout Student:number() endl; /ok 用類名引導(dǎo)靜態(tài)成員函數(shù),運行結(jié)果為: 1 1 靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別是什么? 它們的根本區(qū)別在于靜態(tài)成員函數(shù)沒有this指針,而非靜態(tài)成員函數(shù)有一個指向當(dāng)前對象的指針this。 例如: class Sc public: void nsfn(int a); /像聲明Sc:nsfn(Sc* this,int a,static void sfn(int a); /無this指針 / void f(Sc /轉(zhuǎn)換為Sc:sfn(10) 函數(shù)nsfn()可被認(rèn)為它聲明為void Sc:nsfn(Sc* this,int a)。對nsfn()的調(diào)用,編譯像注解的那樣進(jìn)行轉(zhuǎn)換,s的地址作為第一個傳遞的參數(shù)。 在函數(shù)內(nèi)部,Sc:nsfn()對非靜態(tài)成員的訪問將自動地,把this參數(shù)作為指向當(dāng)前對象的指針。而當(dāng)Sc:sfn()被調(diào)用時,沒有任何對象的地址被傳遞。 15.4 需要友元的原因 友元函數(shù)完全是普通的C+函數(shù),不同的是,它可以訪問類的保護(hù)或私有成員,方便編程,提高了效率,但卻破壞了類的封裝。 15.5 友元的使用 在類里聲明一個普通函數(shù),標(biāo)上關(guān)鍵字friend,就成了
溫馨提示
- 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年福建華東師范大學(xué)附屬三明中學(xué)招聘教師34人筆試歷年參考題庫附帶答案詳解
- 現(xiàn)代建筑設(shè)計與人類健康的關(guān)系探討
- 社區(qū)農(nóng)副產(chǎn)品超市與社交電商的結(jié)合模式研究
- 電子商務(wù)平臺的促銷活動策劃
- 社交媒體用戶行為與社交網(wǎng)絡(luò)影響力研究
- 科技助力生產(chǎn)安全監(jiān)管與預(yù)警系統(tǒng)
- 科技公司如何有效執(zhí)行戰(zhàn)略
- 2025甘肅利鴻新材料科技有限公司招聘33人筆試參考題庫附帶答案詳解
- 社交網(wǎng)絡(luò)平臺在醫(yī)療行業(yè)的運營模式探討
- 2025至2030年中國蒸餾量筒數(shù)據(jù)監(jiān)測研究報告
- 2025年春季學(xué)期學(xué)校全面工作安排表
- 光伏施工安全培訓(xùn)課件
- 部編人教版小學(xué)4四年級《道德與法治》下冊全冊教案
- 初中八年級上冊音樂課件4.2欣賞沃爾塔瓦河(14張)ppt課件
- 部編版語文一年級下冊繪本閱讀課-優(yōu)質(zhì)課件.pptx
- 新人教版九年級全一冊物理知識點填空題匯編
- 人教版五年級數(shù)學(xué)下冊每個單元教材分析(共九個單元)
- 辦好高水平民辦高中的哲學(xué)思考-教育文檔
- 小學(xué)生如何理解句子的含義(課堂PPT)
- 學(xué)科分類與代碼(管理學(xué))
- PROE拆電極教程
評論
0/150
提交評論