我們在類裡面會定義成員函數,同時我們也希望定義成員函數指針。因此需要解決3個問題,第一怎麼定義類的函數指針,第二賦值,第三使用。
我定義一個類,
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
};
int A::add(int a,int b)
{
return a + b;
}
int A::mul(int a,int b)
{
return a * b;
}
int A::div(int a,int b)
{
return (b !=0 ? a/b : a);
}
我現在想要定義一個指針,指向A類型中返回值為int,參數為兩個int的函數指針。熟悉C的同學馬上會寫出typedef int (*oper)(int,int)。但是這個用到C++裡就有問題了,
因為我們知道,類的非static成員方法實際上還有this指針的參數。比如add方法,它實際的定義可能會這樣int add(A* this,int a,int b);因此,我們不能簡單把C語言裡的那套東西搬過來,我們需要重新定義這種類型的指針。正確做法是加上類型,typedef int (A::*Action)(int,int)
typedef int (A::* Action)(int,int);
int main()
{
A a;
Action p = &A::add;
cout << (a.*p)(1,2) << endl;
return 0;
}
Action p = &A::add;這個就是賦值語句
調用的時候注意,直接這樣(*p)(1,2)是不行的,它必須綁定到一個對象上(a.*p)(1,2);我們也可以把類的函數指針定義在類的聲明裡。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*oper)(int,int);
};
上面這種方式是針對非static成員函數的,那麼static成員函數的函數指針應該怎麼定義呢,還能用上面這種方式嗎?我們知道static成員函數是沒有this指針的,所以不會加上的類的限定,它的函數指針定義方式和C裡面的函數指針定義方式一樣的。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
static int sub(int,int);
};
int A::sub(int a,int b)
{
return a - b;
}
int main()
{
int (*pp)(int,int) = &A::sub;
cout << (*pp)(10,5) << endl;
return 0;
}
總結起來,非static成員函數的函數指針需要加上類名,而static的成員函數的函數指針和普通的函數指針一樣,沒有什麼區別。
另外注意一點的是
如果函數指針定義在類中,調用的時候有點區別。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*pfunc)(int,int);
};www.2cto.com
int main()
{ www.2cto.com
A a;
a.pfunc = &A::add;
cout << (a.*(a.pfunc))(1,2) << endl;
return 0;
}