成員指針解引用操作符(.*)從對象或引用獲取成員
*成員指針箭頭操作符(->*)通過對象的指針獲取成員
類成員函數指針定義
因為函數是一個類的成員,所以它的指針定義有別於全局函數,格式如下:
typedef 返回值(類名::*函數指針類型名稱)(參數列表);
需要注意的地方
1) 使用typedef創建一個用戶自定義類型,這個類型的名稱即上述格式中的函數指針類型名稱
2) 在函數指針類型名稱之前需要添加類名,並加上雙引號(::)
初始化方式
假設我們的一個類有如下的成員函數:
bool DriveCar(LPCTSTR pszCar);
則對應的,我們定義了如下的類成員函數指針來描述此成員函數
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.)。
作者:漫漫開發路
鏈接:https://www.jianshu.com/p/036f0c789db2
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
