c第十四章靜態(tài)成員與友元_第1頁
c第十四章靜態(tài)成員與友元_第2頁
c第十四章靜態(tài)成員與友元_第3頁
c第十四章靜態(tài)成員與友元_第4頁
c第十四章靜態(tài)成員與友元_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論