C++類和對象的其他特性_第1頁
C++類和對象的其他特性_第2頁
C++類和對象的其他特性_第3頁
C++類和對象的其他特性_第4頁
C++類和對象的其他特性_第5頁
已閱讀5頁,還剩18頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、目目 錄錄F第第1章章 C+概述概述F第第2章章 數據類型、運算符和表達式數據類型、運算符和表達式F第第3章章 簡單的輸入簡單的輸入/輸出輸出F第第4章章 C+的流程控制的流程控制F第第5章章 函數函數F第第6章章 編譯預處理編譯預處理F第第7章章 數組數組F第第8章章 結構體、共同體和枚舉類型結構體、共同體和枚舉類型F第第9章章 指針和引用指針和引用F第第10章章 類和對象類和對象F第第11章章 類和對象的其他特性類和對象的其他特性F第第12章章 繼承和派生繼承和派生F第第13章章 多態性多態性F第第14章章 輸入輸入/輸出流輸出流F第第15章章 模板模板v第一部分第一部分 面向過程的程序設

2、計面向過程的程序設計v第二部分第二部分 面向對象的程序設計面向對象的程序設計第第11章章 類和對象的其他特性類和對象的其他特性 一個類的不同對象,其數據成員的存儲空間是相互獨立的。一個類的不同對象,其數據成員的存儲空間是相互獨立的。 11.1 靜態成員靜態成員ChengF20 a bZhangM18class Personchar Name20; /姓名姓名 char Sex; /性別性別 int Age; /年齡年齡public:;Person a(Cheng, F, 20), b(Zhang, M, 18);如果將類的一個成員定義成如果將類的一個成員定義成靜態型靜態型的,的,則該類的則該類

3、的所有對象所有對象的該成員共用同一存儲空間。的該成員共用同一存儲空間。 class Sampleprivate:int a, b, c ; static int d ; / 定義靜態數據成員定義靜態數據成員 s1, s2, s3;abcs1 s2 s3abcabcdSample:靜態數據成員是屬于類的。靜態數據成員是屬于類的。 2.靜態數據成員的初始化靜態數據成員的初始化 必需在類體外進行必需在類體外進行 class Sampleprivate:int a, b, c ; static int d ; / 定義靜態數據成員定義靜態數據成員 s1, s2, s3;int Sample:d = 1

4、0; / 初始化初始化3.靜態數據成員的引用靜態數據成員的引用 例例11.1例例11.1 靜態數據成員的使用靜態數據成員的使用#include class Sampleint n;static int sum; /靜態成員靜態成員public:Sample(int x) n=x; void add( ) sum+=n; void disp( ) coutn=n,sum=sumendl;int Sample:sum = 0; /靜態數據成員的初始化靜態數據成員的初始化void main( ) Sample a(2), b(3), c(5); a.add( ); a.disp( ); b.add(

5、 ); b.disp( ); c.add( ); c.disp( ); / A cout sizeof(a) : sizeof(a)endl; cout sizeof(b) : sizeof(b)endl; cout sizeof(c) : sizeof(c)endl; 運行結果是:運行結果是:n=2, sum=2n=3, sum=5n=5, sum=10sizeof(a) : 4sizeof(b) : 4sizeof(c) : 4必須在類外初始化必須在類外初始化使用靜態成員是為了解決使用靜態成員是為了解決 對象之間的數據共享問題。對象之間的數據共享問題。 n:2 n:3 n:5a b cSa

6、mple: sum: 10如果將主函數改寫為:如果將主函數改寫為:void main( ) Sample a(2), b(3), c(5); a.add( ); b.add( ); c.add( ); a.disp( ); b.disp( );c.disp( );此程序的運行結果是:此程序的運行結果是:n=2, sum=10n=3, sum=10 n=5, sum=10 靜態成員函數屬于類,就像靜態數據成員屬于類一樣。靜態成員函數屬于類,就像靜態數據成員屬于類一樣。(1 1)只能通過類名調用)只能通過類名調用靜態成員函數靜態成員函數。(2 2)在)在靜態成員函數靜態成員函數中只能訪問靜態數據成

7、員。中只能訪問靜態數據成員。例例11.2 靜態成員函數的使用靜態成員函數的使用#include class Sampleint a;static int b;public:Sample(int x) a=x; b+=x;static void disp(Sample s) / A couta=s.a, b=bendl; / B ;int Sample:b=10; /靜態數據成員賦初值靜態數據成員賦初值void main( )Sample s1(2), s2(3);Sample:disp(s1); / CSample:disp(s2); / D 運行結果如下:運行結果如下:a=2, b=15a=

8、3, b=1511.2 11.2 友元友元(1)類具有)類具有封裝性封裝性和信息的和信息的隱蔽性隱蔽性。(2)只有在類內可以訪問私有成員。)只有在類內可以訪問私有成員。(3)在類外,只能通過公有函數接口才能訪問私有成員。)在類外,只能通過公有函數接口才能訪問私有成員。例例11.3 通過公有函數接口訪問私有成員通過公有函數接口訪問私有成員#include #include class Pointint x, y;public:Point(int a=0, int b=0) x=a; y=b; 例例11.3 (續(續1) Point( ) void Show( ) coutPoint(x,y)n;

9、 int Getx( ) return x; int Gety( ) return y;double distance(Point &p1, Point &p2 ) / 注意:此函數是普通函數注意:此函數是普通函數 參見參見 return sqrt(p1.Getx( )p2.Getx( )*(p1.Getx( )p2.Getx( ) +(p1.Gety( )p2.Gety( )*(p1.Gety( )p2.Gety( );多次調用公有函數接口多次調用公有函數接口訪問私有數據成員,訪問私有數據成員,這樣帶來的函數調用這樣帶來的函數調用時間開銷是比較大的。時間開銷是比較大的。 例例

10、11.3 (續(續2) void main( )Point p1, p2(1, 1);cout distance(p1, p2) endl; 能否在能否在distance( ) 函數中直接訪問函數中直接訪問Point 的私有成員呢的私有成員呢?回答是肯定的!回答是肯定的!只要將只要將 distance( ) 函數說明為類函數說明為類 Point 的友元函數的友元函數!方法是:方法是:class A . friend void fun(.); /說明函數說明函數fun( )是類是類A的友元函數的友元函數 . ;void fun(.) class A a; /于是在此函數中,于是在此函數中, .

11、/可以直接訪問類可以直接訪問類A的私有成員的私有成員 修改修改 例例11.3 如下:如下:class Pointint x, y;public: friend double distance(Point&, Point& ); / A;double distance(Point &p1, Point &p2 ) 參見參見return sqrt(p1.xp2.x)*(p1.xp2.x)+(p1.yp2.y) *(p1.yp2.y); / Bvoid main( )Point p1, p2(1,1);coutdistance(p1,p2)endl;程序簡潔,程序簡潔

12、,時間開銷較小。時間開銷較小。 慎用友元,因為友元慎用友元,因為友元破壞了類的數據成員破壞了類的數據成員的隱蔽性。的隱蔽性。例例11.4 將將main函數作為一個類的友元函數函數作為一個類的友元函數#include class Sampleint x, y;public:Sample(int a=0, int b=0)x=a; y=b; void Show( )coutx=x, y=yn;friend void main( ); /說明主函數是類的友元函數說明主函數是類的友元函數;void main( ) Sample s(3, 6); coutx=s.x, y=s.yn; s.Show( )

13、;程序的運行結果如下:程序的運行結果如下:x=3, y=6x=3, y=6main( )函數是函數是Sample類的友元函數,類的友元函數,所以在中所以在中main( )函數可直接訪問類函數可直接訪問類Sample的私有成員。的私有成員。關于友元函數的幾點說明:關于友元函數的幾點說明:友元函數不是類的成員函數。因此,對友元函數友元函數不是類的成員函數。因此,對友元函數指定訪問權限無效,可以把友元函數的說明放在指定訪問權限無效,可以把友元函數的說明放在 private、public、protected 的任意段中。的任意段中。使用友元函數的目的是提高程序的運行效率。使用友元函數的目的是提高程序的

14、運行效率。慎用友元函數,因為它可在類外直接訪問類的私慎用友元函數,因為它可在類外直接訪問類的私有或保護成員,破壞了類的信息隱藏的特性。有或保護成員,破壞了類的信息隱藏的特性。 另一個類的友元函數另一個類的友元函數 不僅不僅普通函數普通函數可以做友元函數,一個類的成員可以做友元函數,一個類的成員函數也可以作為另一個類的友元。函數也可以作為另一個類的友元。例例11.5見見 “第第11章章 類和對象的其他特性類和對象的其他特性(例子例子).doc”(1 1)一個類可以作為另一個類的友元)一個類可以作為另一個類的友元 (2 2)當一個類作為另一個類的友元時,)當一個類作為另一個類的友元時, 就意味著這

15、個類的所有成員函數就意味著這個類的所有成員函數 都是另一個類的友元函數都是另一個類的友元函數 。class A . friend class B; / B類是類是A類的友元類的友元 ;class B . public: void f1( ); float f2( ); float f3( );/ 因此,在因此,在 B類類 的所有成員函數中,的所有成員函數中,/ 均可訪問均可訪問 A類類 的私有成員的私有成員例例11.6 將一個類說明為另一個類的友元類將一個類說明為另一個類的友元類#include class B; /引用性說明引用性說明class A int x; void Disp( )coutx=xendl;friend B;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論