您好,登錄后才能下訂單哦!
C++中如何使用成員函數(shù)指針,針對這個問題,這篇文章詳細介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
一個成員函數(shù)的指針指向類中的一個成員函數(shù),并和以前有相同的參數(shù),聲明如下:
float (SomeClass::*my_memfunc_ptr)(int, char *);
對于使用const關(guān)鍵字修飾的成員函數(shù),聲明如下:
float (SomeClass::*my_const_memfunc_ptr)(int, char *) const;
注意使用了特殊的運算符(::*),而“SomeClass”是聲明中的一部分。C++成員函數(shù)指針有一個可怕的限制:它們只能指向一個特定的類中的成員函數(shù)。對每一種參數(shù)的組合,需要有不同的成員函數(shù)指針類型,而且對每種使用const修飾的函數(shù)和不同類中的函數(shù),也要有不同的函數(shù)指針類型。在MSVC中,對下面這四種調(diào)用方式都有一種不同的調(diào)用類型:
__cdecl, __stdcall, __fastcall, 和 __thiscall。
(__thiscall是缺省的方式,有趣的是,在任何官方文檔中從沒有對__thiscall關(guān)鍵字的詳細描述,但是它經(jīng)常在錯誤信息中出現(xiàn)。如果你顯式地使用它,你會看到“它被保留作為以后使用(it is reserved for future use)”的錯誤提示。)
如果你使用了C++成員函數(shù)指針,你***使用typedef以防止混淆。將函數(shù)指針指向型如float SomeClass::some_member_func(int, char *)的函數(shù),你可以這樣寫:
my_memfunc_ptr = &SomeClass::some_member_func;
很多編譯器(比如MSVC)會讓你去掉“&”,而其他一些編譯器(比如GNU G++)則需要添加“&”,所以在手寫程序的時候我建議把它添上。若要調(diào)用成員函數(shù)指針,你需要先建立SomeClass的一個實例,并使用特殊操作符“->*”,這個操作符的優(yōu)先級較低,你需要將其適當?shù)胤湃雸A括號內(nèi)。
SomeClass *x = new SomeClass; (x->*my_memfunc_ptr)(6, "Another Arbitrary Parameter");
如果類在棧上,你也可以使用“.*”運算符。
SomeClass y; (y.*my_memfunc_ptr)(15, "Different parameters this time");
不要怪我使用如此奇怪的語法——看起來C++的設(shè)計者對標點符號有著由衷的感情!C++相對于C增加了三種特殊運算符來支持成員指針?!?:*”用于指針的聲明,而“->*”和“.*”用來調(diào)用指針指向的函數(shù)。這樣看起來對一個語言模糊而又很少使用的部分的過分關(guān)注是多余的。(你當然可以重載“->*”這些運算符,但這不是本文所要涉及的范圍。)
一個C++成員函數(shù)指針可以被設(shè)置成0,并可以使用“==”和“!=”比較運算符,但只能限定在同一個類中的成員函數(shù)的指針之間進行這樣的比較。任何成員函數(shù)指針都可以和0做比較以判斷它是否為空。與函數(shù)指針不同,不等運算符(<, >, <=, >=)對C++成員函數(shù)指針是不可用的。
關(guān)于C++中如何使用成員函數(shù)指針問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。