zoukankan      html  css  js  c++  java
  • 个人对回调函数的理解(personal understanding of callback function)

    之前觉得回调函数很神奇,而且我自己也没怎么用过,就更添了一些神秘感。有一天突然特别想了解一下,结果找遍了网上的各大网站和博客,没有发现一个比较好的解释。要么直接上代码,没有一点讲解;要么讲解的云里雾里,上的例子都是windows里面的现成的回调函数。但是,经过我个人的琢磨,发现其实这玩意没啥太深奥的,在此记录一下自己的对回调函数的理解,也希望对入门回调函数的人有用。

    1.回调函数的定义

    百度百科给的定义:回调函数就是一个通过函数指针调用的函数。

    维基百科给的定义:回调函数,或简称回调,是指通过函数参数传递到其它代码的,某一块可执行代码的引用。

    虽然百度百科一般来说没有维基百科准,但是关于回调函数的定义还是百度百科给的比较直白,维基的那个定义对于入门者来说太抽象太拗口。

    我的理解是,回调函数和其他声明的函数没有任何本质区别,只是调用的时候有区别。或者说,随便一个函数,比如叫:int fun(int para),如果你用fun(10)这种方法调用,它就是普通函数,如果你用指针方法调用),那么它就是回调函数。可见,回调函数和普通函数的区别不是本体,仅仅是调用的方法不同。

    2.回调函数的具体用法

    假设我们有两个函数A和B,我们想把A作为回调函数,在B中用函数指针来调用它,那么怎么做呢?其实很简单:

    首先,A的定义和声明还是照常写,例如,返回两个输入变量的乘积:

    int A(int x,int y)
    {
        return x*y;
    }

    然后,B的定义和声明就有点讲究了,因为要用函数指针调用A,所以B的形参中需要一个函数指针指向A,具体来讲就是这么写:

    void B(int(*ptr)(int x,int y),int para)
    {
        int result=(*ptr)(5,10)*para;
        printf("%d\n",result);
    }

    看起来好像很奇怪,其实也没什么,就是第一个参数是个函数指针而已,而函数指针的写法,也没什么复杂,原来的方法是:

    int A(int x,int y)
    只要把A替换成一个指针形势就行,例如:(*p),(*ptr)这种,其他的保持不变即可。在此稍微提一下函数指针,具体写法是:
    int(*p)(int x,int y)=&A;

    p就是指向函数A的指针。

    最后,在main函数里面调用B即可测试我们的写的对不对:

    int main()
    {
        B(&A,8);
        system("pause");
        return 0;
    }

    3.回调函数的作用

    说到回调函数的作用,我刚开始也不太明白,后来咨询了lp大人然后自己又领悟了一会,算是大致明白了。总的来说,回调函数可以将不同层次的开发分开,适用于二次开发。比如:底层开发者已经写完整体框架,其中有一些函数是开放给顶层开发者使用的,那么可以用此种方式。另外,这也防止顶层开发者看到或改动源代码(如果底层开发者不希望源码开发或者不希望框架被改动)。因为顶层开发者只需要写好B函数,然后将B函数传入A(即调用A函数)即可。具体来说,就是底层开发者写好了B函数,然后顶层开发者可以自己写A和main函数,但是只能调用B函数,关键的其实并不是回调函数本身,而是调用回调函数的那个B怎么实现。如果我们还是按照常规的函数调用方法的话,A,B和main是不能分开的,因为如果A被修改了,那么B中每一处调用A的地方都需要修改,可是B的代码是不开放的,这就很难做到了。但是,如果把A作为一个参数传给B,那么修改的时候只需要修改B的形参即可。

    以上就是我对回调函数的一些理解。

  • 相关阅读:
    fastjson报错 java.lang.StackOverflowError
    关于mybatis使用foreach插入速度较慢的问题
    selectKey返回查询的LAST_INSERT_ID的总是1
    使用java制作https证书
    cf 809
    多校 2009 3
    多校 2009 2
    多校 2009 1
    codeforces 808
    hdu 4734 数位DP
  • 原文地址:https://www.cnblogs.com/hrlnw/p/2802272.html
Copyright © 2011-2022 走看看