指向成員函數的函數指針

C語言中的函數指針還是很簡單的,這裏還是稍微總結一下:

  • 函數地址:
        函數名,&函數名,兩者均可。
  • 函數指針變量的定義方法:
        把函數名替換爲你喜歡的變量名,並在前面加*號,並把*號和函數名()起來。
  • 函數指針類型的定義方法:
        把上一步的變量名替換爲你喜歡的類型名,前面再直接加typedef即可。

例子:

(1) 函數定義如下:

char *parseFrame(char* frame, int len);

(2) 定義一個函數指針變量pFunc指向parseFrame這個函數:

char *(*pFunc)(char* frame, int len);
pFunc = parseFrame;

(3) 定義一個函數指針類型ParseFunc,並用這個類型定義一個函數指針變量pFunc,指向parseFrame這個函數:

typedef char *(*ParseFunc)(char* frame, int len);
ParseFunc pFunc;
pFunc = parseFrame;

 

 

在C++中,要想寫一個指向成員函數的函數指針,以上知識就不夠用了。

  • 成員函數地址爲:
        &類名::成員函數名,與上面的C語言風格相比,這裏必須要加&符號。
  • 指向成員函數的函數指針變量的定義方法:
         把函數名替換爲你喜歡的變量名,前加上【類名::*】,並把【類名::*變量名】用()括起來。
  • 指向成員函數的函數指針類型的定義方法:
          把上一步的變量名替換成你喜歡的類型名,並在前面加typedef。

例子:

(1)定義成員函數readAge:

class Person
{
public :
    int readAge(void);
}

(2)定義函數指針變量pFunc指向readAge函數:

int (Person::*pFunc)(void);
pFunc = &Person::readAge;

(3)定義函數指針類型Person::ReadFunc,並用這個類型定義一個函數指針變量pFunc ,指向readAge這個成員函數

typedef int (Person::*ReadFunc)(void);
Person::ReadFunc pFunc =  &Person::readAge;

類型名也可不帶類名前綴,簡寫爲:ReadFunc

(4)在本類的別的成員函數中通過函數指針變量pFunc ,調起readAge這個成員函數

Person::ReadFunc pFunc =  &Person::readAge;
int a = (this->*pFunc)();

(5)在類外,通過函數指針, 調起這個成員函數

Person tom;
Person::ReadFunc pFunc =  &Person::readAge;
int a = (tom.*pFunc)();

(6)常見編譯錯誤:
由上面(4/5)兩點可見,用函數指針調起成員函數,必須要有對象操作,具體來說就是體現爲【this->】或者【obj.】或者【pObj->】,而不能像C語言一樣,直接用函數指針調用,例如上面第(4)條,如果按C語言的方法來寫:
Person::ReadFunc pFunc =  &Person::readAge;
int a =pFunc();//這一行按照C語言語法來看,沒毛病,但在C++中編譯報錯
編譯錯誤提示爲:error: C2064: 項不會計算爲接受 xx 個參數的函數。(博主注:xx等於你傳入的實參數目)

這個編譯錯誤對程序員來說,過於隱晦,讓人不明所以,感覺驢頭不對馬嘴,這裏特意記錄一下。
 

發佈了124 篇原創文章 · 獲贊 214 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章