成員函式指標是 C++ 特有的進階機制,指向類別非靜態成員函式,包含隱含 this 指標調用邏輯。本文系統解析聲明語法、const 成員函式指標、四種調用慣例差異、typedef 簡化複雜型別、調用運算子 .*/->*、比較規則與現代替代方案。
// 一般成員函式指標
float (SomeClass::*my_memfunc_ptr)(int, char*);
// const 成員函式指標
float (SomeClass::*my_const_memfunc_ptr)(int, char*) const;
關鍵:::* 為成員指標宣告運算子,SomeClass 為型別一部分,每個類別、每種簽名、const/非 const 均為獨立型別。
| 慣例 | 關鍵字 | 參數壓棧 | 棧平衡 | this 傳遞 |
|---|---|---|---|---|
| __cdecl | __cdecl | 右至左 | 呼叫者 | ECX/堆疊 |
| __stdcall | __stdcall | 右至左 | 被呼叫者 | ECX/堆疊 |
| __fastcall | __fastcall | 前兩參數寄存器 | 被呼叫者 | ECX |
| __thiscall | (預設) | 右至左 | 被呼叫者 | ECX |
注意:__thiscall 為 MSVC 預設成員函式慣例,文檔極少,不可顯式指定(保留未來用途)。
typedef float (SomeClass::*MemFuncPtr)(int, char*);
MemFuncPtr ptr = &SomeClass::some_member_func; // 取址需 &(GCC 必須,MSVC 可省略)
SomeClass *obj = new SomeClass;
(obj->*ptr)(6, "param"); // 指標物件用 ->*
SomeClass obj2;
(obj2.*ptr)(15, "param"); // 實體物件用 .*
優先級:.*/->* 低於函式呼叫,必須加括號 (obj->*ptr)(args)。
0/nullptr 表示空==/!= 比較(同類別同簽名型別間)<、> 等0 比較判斷空值| 方案 | 優勢 | 適用場景 |
|---|---|---|
std::function | 型別擦除、統一介面、支援 Lambda | 回呼、事件系統、型別擦除需求 |
std::mem_fn | 產生可呼叫物件、支援 std::bind | 算法傳遞成員函式 |
| Lambda 捕獲 this | 語法簡潔、內聯優化、無型別擦除開銷 | 臨時回呼、STL 算法 |
| 委托/訊號槽庫 | 型別安全、連接管理、執行緒安全 | 大型事件架構 |