類的普通成員函式的指標

2021-05-21 22:49:40 字數 1875 閱讀 7043

很 多朋友都知道虛函式有虛函式指標,並且存放在物件的虛函式表中,它和普通成員變數一樣與物件相關,因此虛函式的指標是和物件級的。乙個類的普通成員函式是 類級的,因此普通成員函式的指標也是類級的。乙個類的普通成員函式的指標,少有文獻提及,因為很少需要用到普通成員函式的指標。儘管如此,在一些特殊的場 合,還是有可能需要用到的。

1) 成員函式簡介 在

c++中,成員函式的指標是個比較特殊的東西。對普通的函式指標來說,可以視為乙個位址

,在需要的時候可以任意轉換並直接呼叫。但對成員函式來說,常規型別轉換是通不過編譯的,呼叫的時候也必須採用特殊的語法。

c++專門為成員指標準備了三個運算子

: "::*"

用於指標的宣告,而

"->*"

和".*"

用來呼叫指標指向的函式。比如:

#include

using namespace std;

class foo ;

double foo::one(long inval)

double foo::two(long inval)

// 定義乙個指向成員函式的指標型別,這些成員函式的返回值型別應該是

double

,並且有乙個

long

型別的引數。

typedef double (foo::*pmf)(long);

// 定義乙個以物件呼叫函式指標的方法,其中:

obj:呼叫成員函式指標的物件;

pointer

:成員函式的指標。

// 注意:因為

".*"

優先順序較低,所以該符號的兩端,均需加上括號

#define callmemfun(obj, pointer) ((obj).*(pointer))

// 定義乙個以物件指標呼叫函式指標的方法,其中:

pobj

:呼叫成員函式指標的物件指標;

pointer

:成員函式的指標。

// 注意:因為

"->*"

優先順序較低,所以該符號的兩端,均需加上括號

#define pcallmemfun(pobj, pointer) ((pobj)->*(pointer))

int main(void)

無 法將成員函式型別轉換為其它任何稍有不同的型別,簡單的說,每個成員函式指標都是乙個獨有的型別,無法轉換到任何其它型別。即使兩個類的定義完全相同也不 能在其對應成員函式指標之間做轉換。這有點類似於結構體的型別,每個結構體都是唯一的型別,但不同的是,結構體指標的型別是可以強制轉換的。有了這些特殊 的用法和嚴格的限制之後,類成員函式的指標實際上是變得沒什麼用了。這就是我們平常基本看不到**裡有

"::*", ".*"

和"->*"

的原因。

2) 使用成員函式指標訪問類的私有成員函式

#include

using namespace std;

class foo;

typedef double (foo::*pmf)(long);

#define callmemfun(obj, pointer) ((obj).*(obj.pointer))

#define pcallmemfun(pobj, pointer) ((pobj)->*(pobj->pointer))

class foo

public:               

inline double one(long inval)

inline double two(long inval)

private:

inline double three(long inval)

}; int main(void)

類的普通成員函式的指標

很多朋友都知道虛函式有虛函式指標,並且存放在物件的虛函式表中,它和普通成員變數一樣與物件相關,因此虛函式的指標是物件級的。乙個類的普通成員函式是類級的,因此普通成員函式的指標也是類級的。乙個類的普通成員函式的指標,少有文獻提及,因為很少需要用到普通成員函式的指標。儘管如此,在一些特殊的場合,還是有可...

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

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...

向普通函式傳遞類成員函式指標的問題

將乙個類成員函式的函式指標傳遞給另乙個成員函式是比較簡單的,只要定義乙個函式指標就可以輕鬆實現。示例如下 include using namespace std class test void func2 pfun pfun void func3 private 私有成員函式 void privat...