成員指針解引用操做符(.*)從對象或引用獲取成員
*成員指針箭頭操做符(->*)經過對象的指針獲取成員函數
類成員函數指針定義this
由於函數是一個類的成員,因此它的指針定義有別於全局函數,格式以下:spa
typedef 返回值(類名::*函數指針類型名稱)(參數列表);指針
須要注意的地方orm
1) 使用typedef建立一個用戶自定義類型,這個類型的名稱即上述格式中的函數指針類型名稱對象
2) 在函數指針類型名稱以前須要添加類名,並加上雙引號(::)blog
初始化方式開發
假設咱們的一個類有以下的成員函數:io
bool DriveCar(LPCTSTR pszCar);form
則對應的,咱們定義了以下的類成員函數指針來描述此成員函數
typedef bool (CPerson::*FP_DriveCar)(LPCTSTR pszCar);
注意這裏的類標記(CPerson::),以及類成員指針前的星號(*)。
那麼咱們能夠爲該類定義函數指針類型的數據成員
FP_DriveCar m_pfnDriveCar;
這裏的m_pfnDriveCar是一個數據成員,其類型爲指向類成員的函數指針(FP_DriveCar)。
則該數據成員初始化方法以下:
m_pfnDriveCar = &CPerson::DriveCar;
使用類名做爲前綴,指明咱們須要訪問CPerson類的DriveCar方法。另外,加上取地址符號(&)取得其函數地址。
調用方式
1) 在類內部
(this->*m_pfnDriveCar)(_T(「TestCar」));
2) 在類外部
CPerson person;
FP_DriveCar g_pfnDriveCar = &CPerson::DriveCar;
(person.*g_pfnDriveCar)(_T(「TestCar」));
注意的地方
1) 在類內部調用時,須要加上(this->)。
2) 在類外部調用時,須要加上對象的實例,這裏即(person.)。
3) 函數指針前加上解除引號符號(*)。
如下爲完整的示例代碼
總結
1) 類成員函數指針和普通全局函數指針的區別在於,須要特殊的語法(一般是加上類名)來進行定義和調用,這是由於類成員函數有一個隱藏的this參數。
2) 若是須要在類外部使用類函數指針,則目標類成員函數必須設定爲public訪問類型。
3) 調用時,須要顯式的加上類實例(以上代碼中的this->或者person.)。