关于回调函数的一些理解

关于回调函数的一些理解

首先来看回调函数的基本概念:
回调函数就是一个被作为参数传递的函数。在C语言中,回调函数只能使用函数指针实现,在C++、Python、ECMAScript等更现代的编程语言中还可以使用仿函数或匿名函数。
回调函数的使用可以大大提升编程的效率,这使得它在现代编程中被非常多地使用。同时,有一些需求必须要使用回调函数来实现。
最著名的回调函数调用有C/C++标准库stdlib.h/cstdlib中的快速排序函数qsort和二分查找函数bsearch中都会要求的一个与strcmp类似的参数,用于设置数据的比较方法。

概念读起来很复杂,下面通过一个简单的例子来加深理解:

int Mul(int a,int b,int (*p)(int,int)){
    int c=p(a,b);
    return c*a;
}

int Add(int a,int b){
    return a+b;
}

int main(){
    int a=0,b=0;
    scanf("%d%d",&a,&b);  //a=2,b=3
    int res=Mul(a,b,&Add);
    printf("%d\n",res);
    return 0;
}

Mul函数有3个参数,用户输入的a和b,以及Add函数的地址,我们在Mul函数中用一个函数指针(也就是p)来接收Add的地址。
我们暂且把Mul和Add函数叫做“副函数”,把main函数认为是主函数,在副函数Mul中通过p调用了Add函数,我们就说Add函数是一个回调函数。

对上面的副函数做一个位置上的调换,并且去掉Mul中的第3个参数:

int Add(int a,int b){
    return a+b;
}

int Mul(int a,int b){
    int c=Add(a,b);
    return c*a;
}

int main(){
    int a=0,b=0;
    scanf("%d%d",&a,&b);  //a=2,b=3
    int res=Mul(a,b);
    printf("%d\n",res);
    return 0;
}

会发现运行结果和第一次是一样的,而如果只是删除Mul的第3个参数,而不做Add和Mul函数的位置调换,如下所示,会出现
Implicit declaration of function ‘Add’ 这一报错,(可以认为程序是自上而下编译的,而这种情况下,在编译到Mul中调用的Add函数时,还没有遇到Add函数,于是报错,如果提前声明函数,
int Add(int,int );
就可以避免报错)

int Mul(int a,int b){
    int c=Add(a,b);
    return c*a;
}

int Add(int a,int b){
    return a+b;
}

int main(){
    int a=0,b=0;
    scanf("%d%d",&a,&b);  //a=2,b=3
    int res=Mul(a,b);
    printf("%d\n",res);
    return 0;
}

考虑到以上情况,在传参时如果传入函数地址,在其他函数体内使用函数指针,就会省很多事,也可以说回调函数是一种更加安全的做法。

你可能感兴趣的:(c++)