




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、 12.1 靜態(tài)數(shù)據(jù)靜態(tài)數(shù)據(jù)第十二章第十二章 目目 錄錄 12.3 友元友元 12.2 靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)第十二章小結第十二章小結 全局對象是實現(xiàn)數(shù)據(jù)共享的一種方法,由于它處處可見,全局對象是實現(xiàn)數(shù)據(jù)共享的一種方法,由于它處處可見,因此不夠安全,應盡量在程序中少用全局對象。因此不夠安全,應盡量在程序中少用全局對象。 實現(xiàn)類的多個對象之間的數(shù)據(jù)共享,可使用靜態(tài)成員。實現(xiàn)類的多個對象之間的數(shù)據(jù)共享,可使用靜態(tài)成員。 靜態(tài)成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。靜態(tài)成員包括靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù)。 友元函數(shù)也是一種普通的友元函數(shù)也是一種普通的C+ 函數(shù),但是它可以訪問類函數(shù),但是它可以訪問類的
2、保護或私有成員,方便編程,提高了效率,同時也破壞了的保護或私有成員,方便編程,提高了效率,同時也破壞了類的封裝性。類的封裝性。 本章內(nèi)容:本章內(nèi)容:介紹如何使用靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù),介紹如何使用靜態(tài)數(shù)據(jù)成員和靜態(tài)成員函數(shù),了解友元的使用方法及作用的局限性。了解友元的使用方法及作用的局限性。第十二章第十二章 靜態(tài)成員與友元靜態(tài)成員與友元 A variable that is part of a class, yet is not part of an object of that class, is called a static member. There is exactly one
3、copy of a static member instead of one copy per object, as for ordinary non-static members.12.1 靜態(tài)數(shù)據(jù)靜態(tài)數(shù)據(jù) 在一個類中,若將一個數(shù)據(jù)說明為在一個類中,若將一個數(shù)據(jù)說明為static,則該數(shù)據(jù)稱為靜,則該數(shù)據(jù)稱為靜態(tài)數(shù)據(jù),它告訴編譯器無論建立多少個該類的對象,都只有一態(tài)數(shù)據(jù),它告訴編譯器無論建立多少個該類的對象,都只有一個靜態(tài)數(shù)據(jù)的拷貝,這個拷貝被所有類對象共享。個靜態(tài)數(shù)據(jù)的拷貝,這個拷貝被所有類對象共享。 靜態(tài)數(shù)據(jù)屬于類而共享,不屬于對象獨有。它的值對每個靜態(tài)數(shù)據(jù)屬于類而共享,不屬于對象獨有。
4、它的值對每個對象都是一樣的。對象都是一樣的。 對靜態(tài)數(shù)據(jù)成員的值的更新,即是對所有對象的該靜態(tài)數(shù)對靜態(tài)數(shù)據(jù)成員的值的更新,即是對所有對象的該靜態(tài)數(shù)據(jù)成員值的更新。據(jù)成員值的更新。 靜態(tài)數(shù)據(jù)使用關鍵字靜態(tài)數(shù)據(jù)使用關鍵字static,靜態(tài)數(shù)據(jù)成員在類體中說明,靜態(tài)數(shù)據(jù)成員在類體中說明,在類體外定義,以分配存儲空間并初始化。在類體外定義,以分配存儲空間并初始化。例如:例如:下面例子說明了靜態(tài)數(shù)據(jù)的說明和初始化方法。下面例子說明了靜態(tài)數(shù)據(jù)的說明和初始化方法。#include #include class counter static int count; /在類體內(nèi)說明靜態(tài)數(shù)據(jù)在類體內(nèi)說明靜態(tài)數(shù)據(jù) p
5、ublic: void setcount(int i) count=i; void showcount() coutcount; int counter:count=0; /在類體外定義靜態(tài)數(shù)據(jù)在類體外定義靜態(tài)數(shù)據(jù)void main() counter a,b; a.showcount(); b.showcount(); a.setcount(10); a.showcount(); b.showcount();結果:結果:0 0 10 10 從例子中可見,定義靜態(tài)數(shù)據(jù)成員時,可根據(jù)需要說明其從例子中可見,定義靜態(tài)數(shù)據(jù)成員時,可根據(jù)需要說明其訪問權限控制符。訪問權限控制符。 靜態(tài)數(shù)據(jù)成員的生命期
6、是全局的,編譯器只對它進行一次靜態(tài)數(shù)據(jù)成員的生命期是全局的,編譯器只對它進行一次初始化,將始終保持其值,直到下次改變?yōu)橹?。初始化,將始終保持其值,直到下次改變?yōu)橹?。例如:例如:下面程序說明了靜態(tài)數(shù)據(jù)成員的定義、初始化和使用的下面程序說明了靜態(tài)數(shù)據(jù)成員的定義、初始化和使用的方法。方法。#include class Myclass public: Myclass(int a,int b,int c); void getnumber( ); int getsum(Myclass m); private: int A,B,C; static int sum;int Myclass:sum(0);Myc
7、lass:Myclass(int a,int b,int c) A=a; B=b; C=c; sum+=A+B+C;void Myclass:getnumber(); coutA“;”B“;”Cendl;int Myclass:getsum(Myclass m) return Myclass:sum;void main() Myclass M(3,4,5),N(5,6,7); N.getnumber(); coutM.getsum(M)“;”M.getsum(N)endl;結果:結果:5; 6; 730; 30注意:注意:在成員函數(shù)在成員函數(shù)getsum()中,通過類來使用靜態(tài)數(shù)據(jù)成員中,通過
8、類來使用靜態(tài)數(shù)據(jù)成員sum,如:如:return Myclass:sum;也可以通過對象來使用也可以通過對象來使用sum,如:,如:return m.sum; 下圖形象地說明了一個類下圖形象地說明了一個類Group 的四個對象的存儲分配情的四個對象的存儲分配情況,每個對象具有自己的字符變量況,每個對象具有自己的字符變量ch 的拷貝內(nèi)存空間,而共享的拷貝內(nèi)存空間,而共享靜態(tài)型變量靜態(tài)型變量s,即靜態(tài)變量,即靜態(tài)變量s 在存儲上只需拷貝一處就可以供所在存儲上只需拷貝一處就可以供所有對象使用。有對象使用。class Group char ch; static int s;Group c char c
9、h; Group b char ch;Group d char ch;Group a char ch;static int s;靜態(tài)數(shù)據(jù)成員可應用在以下幾個方面:靜態(tài)數(shù)據(jù)成員可應用在以下幾個方面: 用來保存流動變化的對象個數(shù)用來保存流動變化的對象個數(shù)(如學生人數(shù)如學生人數(shù));(2) 作為一個標志,指示一個特定的動作是否發(fā)生;作為一個標志,指示一個特定的動作是否發(fā)生;(1) (3) 指向一個鏈表的第一成員或最后一個成員的指指向一個鏈表的第一成員或最后一個成員的指針。針。12.1 靜態(tài)成員函數(shù)靜態(tài)成員函數(shù)(Static member function) A function that needs
10、access to members of a class, yet does not need to be invoked for a particular object, is called a static member function. 靜態(tài)成員函數(shù)的說明和定義與靜態(tài)數(shù)據(jù)成員一樣,函數(shù)實靜態(tài)成員函數(shù)的說明和定義與靜態(tài)數(shù)據(jù)成員一樣,函數(shù)實現(xiàn)可在類體內(nèi),也可在類體外,與一般成員函數(shù)相同?,F(xiàn)可在類體內(nèi),也可在類體外,與一般成員函數(shù)相同。 在靜態(tài)成員函數(shù)的實現(xiàn)中,可以直接使用靜態(tài)成員,可以在靜態(tài)成員函數(shù)的實現(xiàn)中,可以直接使用靜態(tài)成員,可以通過對象來使用非靜態(tài)成員。通過對象來使用非靜態(tài)成員。對靜
11、態(tài)成員函數(shù)的訪問,在程序中可使用如下方式:對靜態(tài)成員函數(shù)的訪問,在程序中可使用如下方式: :()或或 .()靜態(tài)成員函數(shù)只屬于一個類,而不屬于類中的任何對象。靜態(tài)成員函數(shù)只屬于一個類,而不屬于類中的任何對象。例如:例如:下面是定義和使用靜態(tài)成員函數(shù)的例子下面是定義和使用靜態(tài)成員函數(shù)的例子#include class M public: M(int a) A=a; B+=a; static void fun(M m); /說明靜態(tài)成員函數(shù)說明靜態(tài)成員函數(shù) private: int A; static int B;void M:fun(M m) /定義靜態(tài)成員函數(shù)定義靜態(tài)成員函數(shù) cout“A=”
12、m.A“,”; /通過對象訪問非靜態(tài)變量通過對象訪問非靜態(tài)變量 cout“B=”Bendl; /直接訪問靜態(tài)變量直接訪問靜態(tài)變量int M:B=10; /定義并初始化靜態(tài)變量定義并初始化靜態(tài)變量void main() M P(6),q(8); M:fun(P); /類名調(diào)用類名調(diào)用 q.fun(q); /對象調(diào)用對象調(diào)用結果:結果:A=6,B=24A=8,B=24例如:例如:下面是另一個程序例子下面是另一個程序例子#include enum access_t shared, in_used, locked, unlocked;class access public: static void s
13、et_access(access_t a) acs=a; static access_t get_access() return(acs); private: static access_t acs;access_t access:acs=0;void main() access obj1,obj2; obj1.set_access(unlocked); if(obj2.get_access()=unlocked) obj2.set_access(in_used); cout“access resourcen”; else cout“l(fā)ocked outn”;輸出為:輸出為:access re
14、source 注意:注意:靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別在于靜靜態(tài)成員函數(shù)與非靜態(tài)成員函數(shù)的根本區(qū)別在于靜態(tài)成員函數(shù)沒有態(tài)成員函數(shù)沒有this 指針,而非靜態(tài)成員函數(shù)有一個隱含的指指針,而非靜態(tài)成員函數(shù)有一個隱含的指向當前對象的向當前對象的this 指針。指針。 例如:例如:該例說明一個靜態(tài)成員函數(shù)與任何當前對象都無聯(lián)該例說明一個靜態(tài)成員函數(shù)與任何當前對象都無聯(lián)系的原因系的原因class Sc public: void nsfn(int a); /類似于類似于Sc:nsfn(Sc *this, int a); static void sfn(int a); /無無this 指針指針 /
15、void fc(Sc& s) s.nsfn(10); /轉換為轉換為Sc:nsfn(&s,10); s.sfn(10); /轉變?yōu)檗D變?yōu)镾c:sfn(10); 例例:Class Studentpublic: Student( ) computerscore=0; Student(float score) computerscore=score; totalscore+=score; count+; static float totalsum( ) return totalscore; static float average( ) void main( ) Student sd1(92),sd
16、2(85),sd3(80); return totalscore/count; coutsd1.totalsum( )endl; coutsd2.average( )endl; private: coutsd3.average( )i=a;void X:member_func(int a) /member function definition i=a;例如:例如:下面程序說明了友元函數(shù)的說明、定義和調(diào)用方法。程下面程序說明了友元函數(shù)的說明、定義和調(diào)用方法。程序功能是求兩點間的距離序功能是求兩點間的距離#include #include class Point public: Point(do
17、uble i, double j) x=i; y=j; void Getxy() cout“(”x“,”y“)”endl; friend double Distance(Point a, Point b); /友元函數(shù)的說明友元函數(shù)的說明 private: double x,y;Double Distance(Point a, Point b) /友元函數(shù)的定義友元函數(shù)的定義 double dx=a.x-b.x; double dy=a.y-b.y; return sqrt(dx*dx+dy*dy);void main() double d11=3.0,d12=4.0,d21=6.0,d22=
18、8.0; Point P1(d11,d12),P2(d21,d22); P1.getxy(); P2.getxy(); double d=Distance(P1,P2); /友元函數(shù)調(diào)用友元函數(shù)調(diào)用 cout“Distance is ”dendl;結果:結果:(3,4)(6,8)Distance is 5二、友元類二、友元類 當說明一個類為另一個類的友元時,友元類中的所有成員當說明一個類為另一個類的友元時,友元類中的所有成員函數(shù)都是另一個類的友元函數(shù)。函數(shù)都是另一個類的友元函數(shù)。例如:例如:下面程序說明友元類的應用,并分析程序輸出結果下面程序說明友元類的應用,并分析程序輸出結果#include class X public: friend class Y; /類類Y 是類是類X 的友元類的友元類 void set(int i) x=i; void display() cout“x=”x“,”“y=”yendl; private: int x; static int y; /靜態(tài)數(shù)據(jù)說明靜態(tài)數(shù)據(jù)說明;class Y public: Y(int i,int j); voi
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年熱風除皺機市場前景分析及投資策略與風險管理研究報告
- 2025-2030年水產(chǎn)飼料行業(yè)市場深度分析及發(fā)展趨勢與投資戰(zhàn)略研究報告
- 2025-2030年新生兒監(jiān)護儀行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 2025-2030年折疊自行車行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- 市政工程考試時效管理策略與試題及答案
- 特色資源的市政工程試題及答案
- 2025-2030年廢舊手機行業(yè)市場深度調(diào)研及前景趨勢與投資戰(zhàn)略研究報告
- 2025-2030年巖棉產(chǎn)業(yè)市場深度調(diào)研及發(fā)展趨勢與投資研究報告
- 2025-2030年室內(nèi)兒童樂園行業(yè)市場發(fā)展分析與發(fā)展前景及投資戰(zhàn)略研究報告
- 2025-2030年安全監(jiān)視設備產(chǎn)業(yè)市場發(fā)展分析及前景趨勢與投資管理研究報告
- 學業(yè)水平考試復習高中語文文言文課本翻譯
- 蘇教版二年級(下冊)科學全冊單元測試卷含期中期末(有答案)
- 常用原料凈料率參照表
- 高低溫試驗報告
- 第一章 混凝土拌合站組織機構框圖及崗位職責
- 17025實驗室體系
- 指南預應力簡支t形梁橋
- 湘教版八年級數(shù)學下冊第3章《圖形與坐標》復習
- WET工藝介紹
- 上海2號線東延伸AFC系統(tǒng)接入既有線的實施方案
- 屋面及防水工程工程量計算PPT課件
評論
0/150
提交評論