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