Function Pointer

  在C/C++中,有一个很有意思的语法结构——函数指针,还有一个与之类似的概念——指针函数。

在语法结构上,函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,函数指针可以用来指向一个函数。

举例说明:

指针函数大多这样定义int *fun(int x,int y);他返回的是一个指向整型数据的地址指针,其值是指针;

函数指针大多这样定义int (*fun)(int x, int y);他一般表示为指向数组的首地址,或者是指向函数代码的首地址,指向函数代码首地址的指针变量。

注意:()的优先级要比*高。

比如有一个分割字符串的函数strtok_s,函数原型如下:

  1. char *strtok_s( char *strToken, const char *strDelimit, char **context );  

他的返回值就是一个指向分割后的字符串char*的地址。

而在STL中,有一个算法sort,函数原型如下:

  1. template inline  
  2.     void sort(_RanIt _First, _RanIt _Last);  
  3. template inline  
  4.     void sort(_RanIt _First, _RanIt _Last, _Pr _Pred);  

其中的_Pr _Pred就是一个_Pr类型的类对象或是函数指针。

     其实,函数指针就相当于C#中委托的概念,但却有本质上的区别,这里不做详细讨论。

函数指针最大的优点是调用中具有相同的入口,可以有不同的实现。比如说上面的sort算法,在传入不同的函数体_Pred的时候,你可以传入升序的方法,也可以传入降序的方法,但只需编写一个函数sort就可以实现两个功能(甚至多个,和你的传入_Pred有关,比如你可以让一个整数向量中偶数升序,奇数降序排序)。好处显而易见,STL中的很多算法都是如此实现。

     我们也可以如此使用,下面举例:

  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. typedef void (*Fun)(intint );  
  6.   
  7. class A  
  8. {  
  9. public:  
  10.     void PointFun( int a, Fun pFun );  
  11.   
  12.     static void myFun(int a, int b);  
  13. };  
  14.   
  15. class B  
  16. {  
  17. public:  
  18.     static void MyFunB(int a, int b);  
  19.     void CallAFun();  
  20. };  
  21.   
  22. void A::PointFun( int a, Fun pFun )  
  23. {  
  24.     int m = a;  
  25.     int n = 2;  
  26.     pFun(m, n);  
  27. }  
  28.   
  29. void A::myFun(int a, int b)  
  30. {  
  31.     cout<<a<<" "<<b<<endl;  
  32. }  
  33.   
  34. void B::MyFunB( int a, int b )  
  35. {  
  36.     cout<<a<<" "<<b<<endl;  
  37. }  
  38.   
  39. void B::CallAFun()  
  40. {  
  41.     A pA;  
  42.     pA.PointFun(8 , &B::MyFunB);  
  43. }  
  44.   
  45. int main(void)  
  46. {  
  47.     A pA;  
  48.     pA.PointFun(3, &A::myFun);  
  49.   
  50.     B pB;  
  51.     pB.CallAFun();  
  52.   
  53.     system("pause");  
  54.     return 0;  
  55. }  

     应当注意的是,如果想在类中实现,函数体要么设为全局函数,要么设为静态函数。因为,函数指针指向的是一块代码区,地址是不属于任何一个对象的。

    上面的代码中,A::myFun和B::MyFunB都是不同的类中的函数实现,一个入口,多种实现!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值