1.對於成員函數,用到函數名的地方,函數名錶示的意義與全局函數或靜態函數有所區別,函數名只表示函數名稱(或函數變量(對象))。如:對成員函數中調用test()是可以的,但調用(*test)()是非法的,顯示Error:“*”的操作數必須是指針。這表示test不能再表示指針(在全局函數中不存在此問題),&test也是不行的。
2.對於在調用成員函數時,A::test()與test()在類內部是一樣的,都A::表示test()與類A綁定了。在外部表示不一樣A::表示要調用靜態的成員函數。
3.對於int *C::func();和int C::(*func)();是不同的。int *C::func()等價於int *func();。int C::(*func)()和int (*func)()也是不一樣的。對於int (*func)()這樣的函數指針定義直接用一個函數地址定義,沒有對象綁定,對於類成員函數,有類型的綁定,成員函數地址是和全局函數地址表示不同,和類型相關,直接賦值函數地址定義的話不行。那麼這就出現一個定義叫類成員(函數或變量)指針。先看如下程序:
class C
{
public:
void (C::*func1)();//放到類外一樣
void func2() { cout << "func2()" << endl; }
void (*func3)();
void test()
{
func1 = &func2;//error
func1 = &C::func2;
(this->*func1)();
i3 = &i1;//雖然對於成員函數無法直接取其地址,成員變量可以直接取其地址
}
public:
int i1;
int C::i2;
int *C::i3;
};
我們想給func3賦值時,但不想用全局函數和類內靜態函數,而想用類成員函數賦值,那麼
func3 = func2//這樣不對,因爲類成員函數單獨使用名字(*func2, &func2, C c, c.func, &(c.func), *(c.func) 都是錯誤的,但全局函數,靜態函數都可以),只能用於函數調用。
c++規定了一個類成員函數指針作爲特殊的函數指針。即:
func1 = &C::func;//正確
對於類變量指針,雖然對於成員函數無法直接取其地址,成員變量可以直接取其地址。同樣類變量指針可以和成員函數指針一樣特殊的定義。
int C::*i1; i1 = &C::i2;
成員函數/變量指針通過.*或->*訪問
調用
c.*func1();//正確
&(c.*func1)//錯誤,因爲指向綁定函數的指針,只能用於函數調用。
c.*i1;//正確
&(c.*i1)//也是正確的
4.(參考)由於成員函數與類綁定(成員函數默認有個參數爲類對象,所以取其指針時候,該函數有個默認的參數沒有直接表明,爲了表明要用A::修飾),那麼取函數指針時,c++規定要顯示註明A::(函數調用不必要)&A::test。如:
#include <iostream>
using namespace std;
class A
{
public:
void (A::*fun)();
void test(){ cout << "ok" << endl; }
public:
void doTest();
};
void A::doTest()
{
fun=&A::test;
(this->*fun)();
}
int main()
{
A a;
a.doTest();
&A::test//甚至在外邊也可以訪問到
}