C 學習之普通函式指標與成員函式指標

2021-07-01 22:52:26 字數 2541 閱讀 8961

函式指標(function pointer) 是通過指向函式的指標間接呼叫函式,相信很多人對指向一般函式的函式指標使用較多,而對指向類成員函式指標則比較的陌生。

一、普通函式指標

通常我們所說得函式指標指向一般普通函式指標,和其他的指標一樣,函式指標指向某種特定的型別,所有被同一指標運用的函式必須指向某種特定的型別,所有被同一指標運用的函式必須具有相同的形參型別和返回型別.

int (*pf)(int, int);   // 宣告函式指標  

這裡,pf指向的函式型別是int (int, int),即函式的引數是兩個int型,返回值也是int型。注:*pf兩端的括號必不可少,如果不寫這對括號,則pf是乙個返回值int指標的函式。

code

#include

#include

using namespace std;

typedef int (*pfun) (int,int);//typedef乙個型別

int add(int a ,int b)

int mns(int a,int b)

string merge(const string& s1,const string& s2)

int main()

如示例**,直接宣告函式指標變數顯得冗長而煩瑣,所以我們可以使用typedef定義自己的函式指標型別。另外,函式指標還可以作為函式的形參型別,實參則可以直接使用函式名。

二、成員函式指標

成員函式指標(member function pointer)是指可以指向類的非靜態成員函式的指標,類的靜態成員不屬於任何物件,因此無須特殊的指向靜態成員指標,指向靜態成員的指標和普通指標沒有什麼區別,與普通函式指標的區別是,成員函式指標不僅要指定目標函式的形參列表和返回值型別,還必須指出成員函式所屬的類,因此,我們必須在*之前新增classname::以表示當前定義的指標指向classname的成員函式:

int (a::*pf)(int,int);//宣告乙個函式指標

同理,這裡a::*pf兩端的括號也是必不可少的,如果沒有這對括號,則pf是乙個返回a類資料成員(int型)指標的函式。注意:和普通函式指標不同的是,在成員函式和指向該成員的指標之間不存在自動轉換規則。

pf = &a::add;   // 正確:必須顯式地使用取址運算子(&)

pf = a::add;    // 錯誤

當我們初始化乙個成員函式指標時,其指向了類的某個成員函式,但並沒有指定該成員所屬的物件——直到使用成員函式指標時,才提供成員所屬的物件.

code

#include

#include

using namespace std;

class a;

typedef int (a::*pclassfun)(int,int);

class a

int mns(int m,int n)

int mul(int m,int n)

int dev(int m,int n)

int call(pclassfun fun,int m,int n)

};int call(a obj,pclassfun fun,int m,int n)//類外部介面

int main()

如示例所示,我們一樣可以使用typedef定義成員函式指標的型別別名。另外,我們需要留意函式指標的使用方法:對於普通函式指標,是這樣使用(*pf)(arguments),因為要呼叫函式,必須先解引用函式指標,而函式呼叫運算子()的優先順序較高,所以(*pf)的括號必不可少;對於成員函式指標,唯一的不同是需要在某一物件上呼叫函式,所以只需要加上成員訪問符即可:

(obj.*pf)(arguments)         // obj 是物件

(objptr->*pf)(arguments)     // objptr是物件指標

三、函式表驅動

對於普通函式指標和指向成員函式的指標來說,一種常見的用法就是將其存入乙個函式表(function table)當中。當程式需要執行某個特定的函式時,就從表中查詢對應的函式指標,用該指標來呼叫相應的程式**,這個就是函式指標在表驅動法中的應用。

#include

#include

#include

using namespace std;

class a;

typedef int (a::*pclassfun)(int, int);

class a

int add(int m, int n)

int mns(int m, int n)

int mul(int m, int n)

int dev(int m, int n)

// 查詢表,呼叫相應函式

int call(string s, int m, int n)

private:

maptable;  // 函式表

};// 測試

int main()

上面是乙個示例,示例中的「表」通過map來實現(當然也可以使用陣列)。表驅動法使用時需要注意:一是如何查表,從表中讀取正確的資料;二是表裡存放什麼,如數值或函式指標。

C 學習之普通函式指標與成員函式指標

函式指標 function pointer 是通過指向函式的指標間接呼叫函式。相信很多人對指向一般函式的函式指標使用的比較多,而對指向類成員函式的函式指標則比較陌生。我最近也被問到了這方面的問題,心中卻也沒有清晰的答案。故決定去查閱資料,並按照自己的思路寫下這篇學習總結。通常我們所說的函式指標指的是...

普通函式指標與類成員函式指標的區別

include 指向函式的指標 typedef int pfun int,int int maxfun int a,int b int minfun int a,int b 通用函式介面,實現對maxfun,minfun函式型別的封裝 int commonfun pfun fun,int a,int...

成員函式指標 (結構 與普通函式指標之間的轉換)

通過記憶體拷貝 memcpy等 可以實現任意指標 間的強制轉換,但不能保證可以正常使用。通過網上查詢發現 函式成員指標其實與普通成員指標不同,它除了包含函式本身位址以外還包含其他資訊 例如是否為虛函式等 所以不能簡單的理解成員函式指標就是普通指標那樣一般佔4位元組,這個視編譯器不同而不同 例如在vs...