首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 成員函式指標完整指南:聲明、調用、調用慣例與 typedef 簡化

     編輯:C++ 入門

成員函式指標是 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 簡化聲明


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 比較判斷空值

現代替代方案

總結

成員函式指標雖語法晦澀(::*、.*、->*、調用慣例),但理解其「綁定類別、簽名、const 屬性」的型別系統本質,配合 typedef 簡化,仍是底層庫開發、高效能回呼的有力工具。現代應用層代碼強烈建議遷移至 std::function/Lambda/std::mem_fn。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案優勢適用場景
std::function型別擦除、統一介面、支援 Lambda回呼、事件系統、型別擦除需求
std::mem_fn產生可呼叫物件、支援 std::bind算法傳遞成員函式
Lambda 捕獲 this語法簡潔、內聯優化、無型別擦除開銷臨時回呼、STL 算法
委托/訊號槽庫型別安全、連接管理、執行緒安全大型事件架構