简单理解回调函数

       第一次听到“回调函数”这个名字的时候,就被它给迷惑了,在网上找了很多解读,慢慢的就理解了它用处和原理。其实原来我自己也用过,只是不知道这种方法的学名叫“回调”,也没有去深究它,这次就借此机会梳理一下回调函数的原理及用法。

       首先说一下回调函数的定义:把一个函数指针作为参数传入到另一个函数中,那么这个作为参数的函数实体就叫回调函数。这话说了等于没说,还是来看实例,举个回调函数比较简单的用法,实现计算器:

                typedef  int(*calculate)(int, int);

                int calculator(int a, int b, calculate func)

                {

                        return func(a, b);

                }

       看以上代码,首先定义了函数指针类型calculate,这个函数就是用来作为参数的回调函数。那么这个函数传进来做什么呢——指定计算的方式。以上的calculator()函数是对入参a,b进行计算,那么如何计算,是加、减、乘、除还是更加高等的运算呢?这一切都看func函数如何实现,继续看以下代码:

                int add (int a, int b)                       minus(int a, int b)

                {                                                    {

                        return a+b;                                    return a-b;  

                }                                                    }

       可以看到以上两个函数,分别实现了加、减功能,如果将add()函数作为第三个参数传入calculator()中则会将a、b相加;若传入的是minus()函数,则会相减。当然也可以在实际运用中实现更加复杂的算法来满足实际需求。由以上这个小实例可以看到,通过使用回调函数,只需改变作为入参的函数,即可以通过同一套代码(即calculator())来实现多种功能,是不是非常简单好用呢。这也是C++中的一种动态绑定了呢。

       除了动态绑定之外,回调函数还有更大的用武之处,即层间协作,也就是我今天碰到的这个回调函数了。在应用程序中,上下层之间只是通过一些接口进行交互,两者数据交流处理变得比较困难,这时候通过使用回调函数就可以很方便的进行交互。

       具体流程可以这么理解:首先下层给上层提供了一个函数“funcA”,这个函数的入参中有一个是函数指针“pfunc”;上层写一个数据处理的函数“funcB”,作为fucnA的“pfunc”参数传递给下层,那么“funcB”就是回调函数;下层在一定条件下触发回调,此时下层完成了本层的处理工作之后,还会调用回调函数“funcB”,将数据交给上层进行进一步处理。

                typedef void(*display)(int);               int main()                                          void multiply(int a, int b,display disply)

                void dispalyResult (int result)           {                                                        { 

                {                                                                multiply(2, 3, dispalyResult);            int c = a * b; 

                        printf ("%d/n", result);                       return 0;                                            disply(c); 

                }                                                        }                                                        }

       如以上代码所示,简单的模拟了上下层的协作。将main()函数所在看做上层,multiply()函数所在看做下层,那么可以很清楚的看到,下层为上层提供了一个multiply()函数来进行乘法计算,并且接受函数指针作为回调;而上层则将完成显示功能的回调函数displayResult()传入;在下层触发了回调之后,下层首先对数据进行乘法运算的处理,再把处理后的数据交给上层,即调用回调函数去显示。

       其实回调函数跟API非常相似,API是底层实现好了给上层调用;而回调函数则是上层实现好了,给底层调用。区别在于,API函数可以直接提供函数名,在调用时直接使用函数名即可;而对于回调函数,底层并不知道回调的名字,而是通过保存其函数指针,在需要调用时,只需引用这个函数指针和相关的参数指针即可。

       

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值