C 成員函式指標詳細使用指南

2021-07-02 23:36:31 字數 1602 閱讀 9504

在c++程式中,很多函式是成員函式,即這些函式是某個類中的一部分。你不可以像乙個普通的函式指標那樣指向乙個成員函式,正確的做法應該是,你必須使用乙個成員函式指標。乙個成員函式的指標指向類中的乙個成員函式,並和以前有相同的引數,宣告如下:

float (someclass::*my_memfunc_ptr)(int, char *); 

對於使用const關鍵字修飾的成員函式,宣告如下:

float (someclass::*my_const_memfunc_ptr)(int, char *) const; 

注意使用了特殊的運算子(::*),而「someclass」是宣告中的一部分。c++成員函式指標有乙個可怕的限制:它們只能指向乙個特定的類中的成員函式。對每一種引數的組合,需要有不同的成員函式指標型別,而且對每種使用const修飾的函式和不同類中的函式,也要有不同的函式指標型別。在msvc中,對下面這四種呼叫方式都有一種不同的呼叫型別:

__cdecl, __stdcall, __fastcall, 和 __thiscall。

(__thiscall是預設的方式,有趣的是,在任何官方文件中從沒有對__thiscall關鍵字的詳細描述,但是它經常在錯誤資訊中出現。如果你顯式地使用它,你會看到「它被保留作為以後使用(it is reserved for future use)」的錯誤提示。)

如果你使用了c++成員函式指標,你最好使用typedef以防止混淆。將函式指標指向型如float someclass::some_member_func(int, char *)的函式,你可以這樣寫:

my_memfunc_ptr

= &someclass::some_member_func; 

很多編譯器(比如msvc)會讓你去掉「&」,而其他一些編譯器(比如gnu g++)則需要新增「&」,所以在手寫程式的時候我建議把它添上。若要呼叫成員函式指標,你需要先建立someclass的乙個例項,並使用特殊操作符「->*」,這個操作符的優先順序較低,你需要將其適當地放入圓括號內。

someclass *x= 

newsomeclass;  

(x->

*my_memfunc_ptr)(6, "another arbitrary parameter"); 

如果類在棧上,你也可以使用「.*」運算子。

someclass y;  

(y.*my_memfunc_ptr)(15, "different parameters this time"); 

不要怪我使用如此奇怪的語法——看起來c++的設計者對標點符號有著由衷的感情!c++相對於c增加了三種特殊運算子來支援成員指標。「::*」用於指標的宣告,而「->*」和「.*」用來呼叫指標指向的函式。這樣看起來對乙個語言模糊而又很少使用的部分的過分關注是多餘的。(你當然可以過載「->*」這些運算子,但這不是本文所要涉及的範圍。)

乙個c++成員函式指標可以被設定成0,並可以使用「==」和「!=」比較運算子,但只能限定在同乙個類中的成員函式的指標之間進行這樣的比較。任何成員函式指標都可以和0做比較以判斷它是否為空。與函式指標不同,不等運算子(<, >, <=, >=)對c++成員函式指標是不可用的。

xxl job詳細使用指南

本篇文章承接上文 xxl job快速入門指南 上一次和大家簡單介紹了下 xxl job 的由來以及使用方法,本篇文章將會詳細介紹一些高階使用方法及特性。上文中我們在新建乙個任務的時候發現有很多的選項,現在我們來詳細聊一聊他們的作用。路由策略是指乙個任務可以由多個執行器完成,那具體由哪乙個完成呢,這就...

C 記憶體對齊詳細使用指南

一 為什麼會有c 記憶體對齊 以下內容節選自 intel architecture 32 manual 為了提高程式的效能,資料結構 尤其是棧 應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問 然而,對齊的記憶體訪問僅需要一次訪問。乙個字或雙字運算元跨越了4...

sqlmap詳細使用指南(1)

1.sqlmap update 更新公升級 2.sqlmap u http current user 獲取當前使用者名稱 3.sqlmap u http current db 獲取當前數 據庫名稱 4.sqlmap u http tables d db name 列表名 5.sqlmap u htt...