類成員函數(shù)指針實踐上是一個指針類型,不可直接通過調(diào)用運算符()作為可調(diào)用對象調(diào)用,一般調(diào)用該類成員函數(shù)指針需要指定該指針對應(yīng)的對象。
成都創(chuàng)新互聯(lián)主打移動網(wǎng)站、網(wǎng)站制作、網(wǎng)站設(shè)計、網(wǎng)站改版、網(wǎng)絡(luò)推廣、網(wǎng)站維護、申請域名、等互聯(lián)網(wǎng)信息服務(wù),為各行業(yè)提供服務(wù)。在技術(shù)實力的保障下,我們?yōu)榭蛻舫兄Z穩(wěn)定,放心的服務(wù),根據(jù)網(wǎng)站的內(nèi)容與功能再決定采用什么樣的設(shè)計。最后,要實現(xiàn)符合網(wǎng)站需求的內(nèi)容、功能與設(shè)計,我們還會規(guī)劃穩(wěn)定安全的技術(shù)方案做保障。
一般情況下調(diào)用類成員函數(shù)指針:
// a.h #ifndef A_H #define A_H #includeusing std::cout; using std::endl; class A{ public: void print(); }; #endif // a.cpp #include "a.h" void A::print() { cout << "A::print" << endl; } // main.cpp #include "a.h" using pClassF = void (A::*)(); // 聲明類A的成員函數(shù)指針類型 int main() { pClassF pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換 A a; (a.*pf)(); // .*、->*成員訪問符,因為訪問優(yōu)先級則(a.*pf)的括號必須添加 return 0; }
其中A::*表示是類A的成員指針,接著的()表示是無參的函數(shù)類型;
如果直接是pf()則出錯,因為pf不是可調(diào)用對象其未指定對象執(zhí)行;
使用
因為類的成員函數(shù)執(zhí)行時,會在參數(shù)列表添加參數(shù)--隱式的this實參,在function模板類調(diào)用時可以傳入對象實現(xiàn)this的功能(傳入的對象不一定是指針類型),function
// main.cpp ,頭文件a.h與源文件a.cpp之前相同 #include#include "a.h" using std::function; using pClassF = void (A::*)(); // 聲明類A的成員函數(shù)指針類型 int main() { auto pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換 A a; // void 表示成員函數(shù)的返回值,A表示傳入的參數(shù)類型為A,因為是模板類型則要求可以準(zhǔn)確匹配,且A類型可以調(diào)用對應(yīng)的成員函數(shù),如果是const A類要調(diào)用const成員函數(shù) function fnt = pf; fnt(a); return 0; }
通過fnt(a)傳入對象a,在function
使用std::mem_fn標(biāo)準(zhǔn)庫函數(shù)
mem_fn函數(shù)可以通過成員函數(shù)指針的類型自動推斷可調(diào)用對象類型,用戶無須指定。在可調(diào)用對象里有接收對象與對象指針的一組調(diào)用運算符重載函數(shù),可使用對象或?qū)ο笾羔樥{(diào)用該成員函數(shù),使用方式與function
// main.cpp,頭文件a.h與源文件a.cpp之前相同 #include#include "a.h" using std::mem_fn; using pClassF = void (A::*)() const; // 聲明類A的成員函數(shù)指針類型 int main() { auto pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換 A a; auto fnt = mem_fn(pf); // mem_fn通過成員函數(shù)指針自動推導(dǎo)可調(diào)用對象類型 fnt(a); // 使用對象調(diào)用成員函數(shù) fnt(&a); // 使用對象指針調(diào)用成員函數(shù) return 0; }
fnt(a)與fnt(&a)的結(jié)果一致。
使用通用的函數(shù)適配器bind生成可調(diào)用對象,需要命名空間std::placeholders表示在bind傳給函數(shù)的參數(shù):
與function
// main.cpp,頭文件a.h與源文件a.cpp之前相同 #include#include "a.h" using namespace std::placeholders; // 用于表示bind傳入指定函數(shù)的形參位置,即bind的_1、_2、...、_n等 using pClassF = void (A::*)() const; // 聲明類A的成員函數(shù)指針類型 int main() { auto pf= &A::print; // 定義類成員函數(shù)指針,不支持函數(shù)到指針的自動轉(zhuǎn)換 A a; auto fnt = bind(pf,_1); // _1表示在bind該位置的參數(shù)傳給pf,并成為pf的第一個形參 fnt(a); // 使用對象調(diào)用成員函數(shù) fnt(&a); // 使用對象指針調(diào)用成員函數(shù) return 0; }
詳細(xì)說明可查閱bind函數(shù),fnt(a)與fnt(&a)的結(jié)果一致。