我們?cè)陬惱锩鏁?huì)定義成員函數(shù),同時(shí)我們也希望定義成員函數(shù)指針。因此需要解決3個(gè)問(wèn)題,第一怎么定義類的函數(shù)指針,第二賦值,第三使用。
我定義一個(gè)類,
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);
}
我現(xiàn)在想要定義一個(gè)指針,指向A類型中返回值為int,參數(shù)為兩個(gè)int的函數(shù)指針。熟悉C的同學(xué)馬上會(huì)寫出typedef int (*oper)(int,int)。但是這個(gè)用到C++里就有問(wèn)題了,
因?yàn)槲覀冎溃惖姆莝tatic成員方法實(shí)際上還有this指針的參數(shù)。比如add方法,它實(shí)際的定義可能會(huì)這樣int add(A* this,int a,int b);因此,我們不能簡(jiǎn)單把C語(yǔ)言里的那套東西搬過(guò)來(lái),我們需要重新定義這種類型的指針。正確做法是加上類型,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;這個(gè)就是賦值語(yǔ)句
調(diào)用的時(shí)候注意,直接這樣(*p)(1,2)是不行的,它必須綁定到一個(gè)對(duì)象上(a.*p)(1,2);我們也可以把類的函數(shù)指針定義在類的聲明里。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*oper)(int,int);
};
上面這種方式是針對(duì)非static成員函數(shù)的,那么static成員函數(shù)的函數(shù)指針應(yīng)該怎么定義呢,還能用上面這種方式嗎?我們知道static成員函數(shù)是沒(méi)有this指針的,所以不會(huì)加上的類的限定,它的函數(shù)指針定義方式和C里面的函數(shù)指針定義方式一樣的。
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;
}
總結(jié)起來(lái),非static成員函數(shù)的函數(shù)指針需要加上類名,而static的成員函數(shù)的函數(shù)指針和普通的函數(shù)指針一樣,沒(méi)有什么區(qū)別。
另外注意一點(diǎn)的是
如果函數(shù)指針定義在類中,調(diào)用的時(shí)候有點(diǎn)區(qū)別。
class A
{
public:
int add(int,int);
int mul(int,int);
int div(int,int);
int (A::*pfunc)(int,int);
};
int main()
{
A a;
a.pfunc = &A::add;
cout << (a.*(a.pfunc))(1,2) << endl;
return 0;
}
posted on 2012-08-14 17:17
梨樹陽(yáng)光 閱讀(1412)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
C++