指向類的成員函數(shù)的指針如何使用(詳解)_第1頁
指向類的成員函數(shù)的指針如何使用(詳解)_第2頁
指向類的成員函數(shù)的指針如何使用(詳解)_第3頁
指向類的成員函數(shù)的指針如何使用(詳解)_第4頁
指向類的成員函數(shù)的指針如何使用(詳解)_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、我們首先復習一下"指向函數(shù)的指針"如何使用?void print(void (*pfun(; 聲明一個指向函數(shù)的指針,函數(shù)的參數(shù)是void,函數(shù)的返回值 是 voidpfun = print; 賦值一個指向函數(shù)的指針(*pfun(; /使用一個指向函數(shù)的指針比較簡單,不是嗎?為什么*pfun需要用(擴起來呢?因為*的運算符優(yōu)先級比(低,如果不用(就成了 *(pfun(.指向類的成員函數(shù)的指針不過多了一個類的限定而已!class Avoid speak(char *, const char *;;void main(A a;void (A:*pmf(char *, const

2、 char *;/ 指針的聲明pmf = &A:speak; 指針的賦值一個指向類A成員函數(shù)的指針聲明為:void (A二*pmf(char *, const char *聲明的解釋是:pmf是一個指向A成員函數(shù)的指針,返回無類型值,函 數(shù)帶有二個參數(shù),參數(shù)的類型分別是char*和const char*。除了在星號前增加 A:,與 聲明外部函數(shù)指針的方法一樣。一種更加高明的方法是使用類型定義:例如,下面的語句定義了 PMA是一個指向A成員函數(shù)的指針,函數(shù)返回無類型值,函數(shù)參數(shù)類型為 char*和const char*:typedef void(A二*PMA(char *, const

3、char *;PMA pmf= &A:strcat; / pmf 是PMF類型(類A成員指針的變量下面請看關于類的使用的示例程序!#includeusing namespacestd;classPersonpublic:/*這里稍稍注意一下,我將 speak(函數(shù)設置為普通的成員函數(shù),而hello(函數(shù)設置為虛函數(shù)*/int value;void speak(cout<< "I am a person!" << endl;printf ("%dn", & Person:speak;/*在這里驗證一下,輸出一下地址就

4、知道了! */virtual void hello(cout<< "Person say "Hello"" << endl;Person(value = 1;;classBaizhantang public Personpublic:void speak(cout<< "I am 白展堂! " << endl;virtual void hello(cout<< "白展堂 say "hello!"" << endl;Baizh

5、antang(value = 2;typedefvoid (Person:*p(;/定義指向Person類無參數(shù)無返回值的成員函數(shù) 的指針typedefvoid (Baizhantang:*q(;/定義指向 Baizhantang類的無參數(shù)無返回 值的指針int main(Personpe;int i = 1;pip;ip = &Person:speak;/ip 指向 Person類 speak函數(shù)(pe.*ip(; 這個是正確的寫法!/ result : I am a Person!/ XXXXXXXXXX( 表示一段地址/* 下面是幾種錯誤的寫法,要注意!* pe.*ip(;* p

6、e.(*ip(;* (pe.(*ip(;* /Baizhantang bzt;q iq = (void (Baizhantang:*(ip; 強制轉換(bzt.*iq(;/ result : I am a Person!/ XXXXXXXXXX( 表示一段地址/向處的函藪有人可能會問了: ip明明被強制轉換成了 Baizhantang類的成員函數(shù)的 指針,為什么輸出結果還是:* I am a Person!在C+里面,類的非虛函數(shù)都是采用靜態(tài)綁定,也就是說 類的非虛函數(shù)在編譯前就已經(jīng)* 確定了函數(shù)地址!ip之前就是指向Person:speak函數(shù)的地址,強制轉換之后,只是指針類型變了,里面*

7、的值并沒有改變,所以調(diào)用的還是Person.speakffl數(shù),細心的家伙會發(fā)現(xiàn),輸出的地址都是一致的.* 這里要強調(diào)一下:對于類的非靜態(tài)成員函數(shù),C+編譯器會給每個函數(shù)的參數(shù)添加上一個該類的指針 this,這也(bzt.的比較清楚;*第二本是侯捷老師翻譯的 深度探索C+對象模型,一聽名字就知道, 講這個就更詳細了 ;iq(; 這里我強調(diào)一下,使用了動態(tài)聯(lián)編,也就是說函數(shù)在運行是才 確定函藪地址!/ result : I am 白展堂!/這一部分就沒有什么好講的了,很明白了!由于speak函數(shù)是普通的成員函數(shù),在編譯時就知道* 至11了 Baizhantang:speak的地址,因止匕(bzt

8、.*ip(會輸出“I am白展堂! ”即 使iq被強制轉換* 成(丫。1 (Person:*(類型的ip,但是其值亦未改變,(bzt.*iq(依然調(diào)用iq指/咦,這就奇怪了,為何與上面的調(diào)用結果不類似?為什么兩個調(diào)用結果不一致?伙伴們注意了:* speak函數(shù)是一個虛函數(shù),前面說過虛函數(shù)并不是采用靜態(tài)綁定的,而 是采用動態(tài)綁定,所謂動態(tài)* 綁定,就是函數(shù)地址得等到運行的時候才確定,對于有虛函數(shù)的類,編 譯器會給我們添加一個指針* vptr,指向一個虛函數(shù)表vptl,vptl里面存放著虛函數(shù)的地址,子類繼承父 類的時候,也會繼承這樣* 一個指針,如果子類復寫了虛函數(shù),那么該表中該虛函數(shù)地址將會由

9、父 類的虛函數(shù)地址替換成子類虛* 函數(shù)地址,編譯器會把(pe.當然,不感興趣的同學這段解釋可以省略,對與使用沒有影響!*/iq = (void (Baizhantang:*(ip;(bzt.*iq(;ip(轉化成為(pe.vptr1(pe,加上動態(tài)綁定,結 果會輸出:* Person say "Hello"*(bzt.*ip(會被轉換成(bzt.vptr1(pe,自然會輸出:* 白展堂 say "Hello"*ps:這里我沒法講得更詳細,因為解釋起來肯定是很長很長的,感興趣的話,我推薦兩本書你去看一看:*第一本是侯捷老師的 深入淺出MFC,里面關于C+的

10、虛函數(shù)特性講/ result:白展堂 say "Hello"/system('pause"return 0;*就是為什么我們在非靜態(tài)類成員函數(shù)里面可以使用this指針的原因,當然,這個過程你看不見!而對于靜態(tài)成員*函數(shù),編譯器不會添加這樣一個this。*/iq = & Baizhantang:speak;/*iq 指向了 Baizhantang類的 speak函數(shù)*/ip= (void (Person:*(iq; /*ip接收強制轉換之后的iq指針*/(bzt.*ip(;/ result : I am 白展堂!/*即 Baizhantang:speak.*/好了,上面講完了普通成員函數(shù),我們現(xiàn)在來玩一點好玩的

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論