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等於你傳入的實參數目)
這個編譯錯誤對程序員來說,過於隱晦,讓人不明所以,感覺驢頭不對馬嘴,這裏特意記錄一下。