計算機科學與編程導論模塊4_第1頁
計算機科學與編程導論模塊4_第2頁
計算機科學與編程導論模塊4_第3頁
計算機科學與編程導論模塊4_第4頁
計算機科學與編程導論模塊4_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

1、模塊四模塊四 友元和引用友元和引用 計算機科學與編程導論計算機科學與編程導論 2 本模塊主要內容本模塊主要內容 l友元友元(friend):即類的朋友,不同類):即類的朋友,不同類 的成員函數之間、類的成員函數與一的成員函數之間、類的成員函數與一 般函數進行數據共享的機制;般函數進行數據共享的機制; l引用引用(reference):即對象的別名。):即對象的別名。 3 一、一、 友元友元 l類的特點是數據隱藏,即類的私有數據只類的特點是數據隱藏,即類的私有數據只 有通過其成員函數訪問。當頻繁訪問類的有通過其成員函數訪問。當頻繁訪問類的 私有成員時,函數調用將使程序的開銷很私有成員時,函數調用

2、將使程序的開銷很 大;大; lC+提供了一種方法提供了一種方法-“友元友元”機制,可機制,可 以破壞封裝性,即允許外面的類或函數訪以破壞封裝性,即允許外面的類或函數訪 問另一個類中的私有成員問另一個類中的私有成員(數據和成員函數據和成員函 數數),這就是友元。,這就是友元。 4 一、一、 友元友元 l將某個外界對象說明為某一個類的友元將某個外界對象說明為某一個類的友元 ,這個外界對象就可以訪問這個類對象,這個外界對象就可以訪問這個類對象 中的私有成員了;中的私有成員了; l聲明為友元的外界對象既可以是另一個聲明為友元的外界對象既可以是另一個 類的類的成員函數成員函數,也可以是不屬于任何類,也可

3、以是不屬于任何類 的的一般函數一般函數,還可以是整個的,還可以是整個的另一個類另一個類; l友元聲明部分友元聲明部分包含在其私有成員可被訪包含在其私有成員可被訪 問的類的定義體中。此聲明可放在公有問的類的定義體中。此聲明可放在公有 部分,也可放在私有部分。部分,也可放在私有部分。 5 友元函數友元函數 l友元函數是在類聲明中由關鍵字友元函數是在類聲明中由關鍵字friend修修 飾說明的非成員函數,在它的函數體中能飾說明的非成員函數,在它的函數體中能 夠通過對象名訪問夠通過對象名訪問 private 和和 protected 成員成員 l作用:增加靈活性,使程序員可以在封裝作用:增加靈活性,使程

4、序員可以在封裝 和快速性方面做合理選擇。和快速性方面做合理選擇。 l訪問對象中的成員必須通過對象名。訪問對象中的成員必須通過對象名。 6 例例11 11 使用友元函數計算兩點距離使用友元函數計算兩點距離 #include #include class Point /Point類聲明類聲明 public:/外部接口外部接口 Point(int xx=0, int yy=0) X=xx;Y=yy; int GetX() return X; int GetY() return Y; friend float Distance(Point private:/私有數據成員私有數據成員 int X,Y;

5、; 7 float Distance( Point double dy=a.Y-b.Y; return sqrt(dx*dx+dy*dy); int main( ) Point p1(3.0, 5.0), p2(4.0, 6.0); double d=Distance(p1, p2); coutThe distance is dendl; return 0; 36 8 友元成員友元成員 l一個類的成員函數作為另一個類的友元一個類的成員函數作為另一個類的友元 ; l在聲明友元成員函數時要加上成員函數在聲明友元成員函數時要加上成員函數 所在的類名和作用域運算符所在的類名和作用域運算符:,格式如,格

6、式如 下:下: friend 函數返回類型函數返回類型 類名類名:函數名函數名(參數表參數表); l例例12 教師修改學生成績。教師修改學生成績。 9 提前引用聲明提前引用聲明 l類應該先聲明,后使用。類應該先聲明,后使用。 l如果需要在某個類的聲明之前,引用該類,則如果需要在某個類的聲明之前,引用該類,則 應進行提前引用聲明。應進行提前引用聲明。 l提前引用聲明只為程序引入一個標識符,但具提前引用聲明只為程序引入一個標識符,但具 體聲明在其它地方。體聲明在其它地方。 10 提前引用聲明舉例提前引用聲明舉例 class B; /提前引用聲明提前引用聲明 class A public: void

7、 f(B b); ; class B public: void g(A a); ; 11 友元類友元類 l友元可以是一個類;友元可以是一個類; l當一個類是另一個類的友元時,它的所有成員當一個類是另一個類的友元時,它的所有成員 函數都成為另一個類的友元函數,即作為友元函數都成為另一個類的友元函數,即作為友元 的類中的所有成員函數都可以訪問另一個類中的類中的所有成員函數都可以訪問另一個類中 的私有成員;的私有成員; l格式為:格式為:friend class 類名類名; l在在A類的定義體中:類的定義體中:friend class B;則則B是是A的的 友元友元。 12 友元類舉例友元類舉例 c

8、lass A friend class B; public: void Display() coutxendl; private: int x; class B public: void Set(int i); void Display(); private: A a; ; 13 void B:Set(int i) a.x=i; void B:Display() a.Display(); 39 例例1313 輸入輸入1010個數,求其最大值和最小值。個數,求其最大值和最小值。 14 友元的特性友元的特性 l不對稱:不對稱:如果如果A是是B的友元,但的友元,但B不不 一定是一定是A的友元;的友元

9、; l不傳遞:不傳遞:友元關系不能傳遞,如果友元關系不能傳遞,如果 A是是B的友元,的友元,B是是C的友元,但的友元,但A不不 一定是一定是C的友元;的友元; l不繼承:不繼承:基類的友元并不能由其派基類的友元并不能由其派 生類繼承。生類繼承。 15 慎用友元慎用友元 l友元對封裝性是一種破壞,但增加友元對封裝性是一種破壞,但增加 靈活性,使程序員可以在封裝和快靈活性,使程序員可以在封裝和快 速性方面做合理選擇;速性方面做合理選擇; l建議:建議:Do not use “friend” if not necessary. 16 7 引用引用 l引用即別名。建立引用時,總要讓引用對應某個目引用即

10、別名。建立引用時,總要讓引用對應某個目 標,此過程即引用的初始化。經過初始化的引用就標,此過程即引用的初始化。經過初始化的引用就 是目標的一個別名,對引用的操作實際上是對目標是目標的一個別名,對引用的操作實際上是對目標 的操作;的操作; l引用是給對象取別名,主要用來給函數傳遞大型的引用是給對象取別名,主要用來給函數傳遞大型的 對象,從函數中返回左值,也可以獨立引用。對象,從函數中返回左值,也可以獨立引用。 l引用定義的格式:引用定義的格式: type int / int *p= 創建了一個整型引用創建了一個整型引用b,b是是a的地址的別名,的地址的別名,b是是a 的同義詞,它們表示同一個對象

11、。的同義詞,它們表示同一個對象。 引 用 17 (1) 引用能夠使用任何合法的變量名;引用能夠使用任何合法的變量名; (2) 引用只是目標的別名,表示同一個對象,在引用只是目標的別名,表示同一個對象,在 定義引用時,需要立即對它進行初始化,不能先定義引用時,需要立即對它進行初始化,不能先 定義、后賦值;定義、后賦值; 類型類型 swap(x, y); swap ( int sx, int sy )函數函數 int value value = sx; 語句語句 sx = sy; 語句語句 sy = value; 語句語句 7 10 實參變量實參變量 x 實參變量實參變量 y 7 10 形參變量形

12、參變量 sx 形參變量形參變量 sy 變量變量 value 復制復制 復制復制 value = sx sx = sy sy = value 10 7 7 swap函數的執行過程和各個變量的變化過程函數的執行過程和各個變量的變化過程 調用調用swap函數函數調用調用swap函數函數調用調用swap函數函數執行執行swap函數函數執行執行swap函數函數執行執行swap函數函數 形參傳遞參數 21 main 函數函數 int x = 7, y = 10; swap( x, y); swap ( int 語句語句 sx = sy; 語句語句 sy = value; 語句語句 swap函數的執行過程和各個變量的變化過程函數的執行過程和各個變量的變化過程 7 10 變量變量 x 變量變量 y max(a, b)20;max(a, b)+; 用引用返回值 引 用 25 為什么有的函數返回引用為什么有的函數返回引用 l如果一個函數的返回值是一個對象的如果一個函數的返回值是一個對象的 值,它就被認為是一個常量,不能成值,它就

溫馨提示

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

評論

0/150

提交評論