回调函数

什么是回调函数?

回调函数就是一个通过函数指针调用的函数

如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。

回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

以上来自百度百科,读着很是拗口。

先请看图:


模块A需要调用模块B中的函数,一般情况下是直接同步调用,就像上面那样。

那回调是什么意思呢?

如果模块A(用户程序)需要模块B(系统或者库函数)提供的功能,比如排序函数sort。

在B中:

而sort的原型为:

void  sort(typename *a, typename *b, pCmp fun);

其中pCmp为:

typedef  bool (* pCmp)(typename, typename);///函数指针

现在在我们自己的程序A中,我们想调用库中的排序函数sort,那么我们必须还要写一个类型为

bool   cmp(typename , typename);///用于比较2个对象大小的函数

的函数,供sort调用。这个函数是我们自己写的,也在模块A中。

这样,也就是像上图中的,我们在A中需要调用B,但是B在实现的时候,还需要调用A中的函数。


如果使用了c++的stl中的排序或者查找算法,尤其是自己定义的对象的时候,你就需要重载一些操作符。他们的作用就是在你调用这些算法时,这些算法也需要调用你写的操作符重载函数。


下面这个图片描述的要比上面的更清晰:




------------------------------------------------------------20130804补充----------------------------------------------------------------------

C中只能使用函数指针的方式进行回调函数,C++既可以像C中那样使用函数指针(C++兼容C嘛),也可以使用仿函数(函数对象)的方式。其本质是在类中重载operator()操作符(必须为成员函数)。

使用回调函数时,可以传递重载了operator()的对象,可以像调用函数那样“调用”该对象。

例如:

#include <iostream>

using namespace std;
class   GT
{
public:
    GT(int v=0):value(v){}

    bool    operator() (int x)
    {
        return  x>value;
    }

private:
    int value;
};

class compare_class
{
    public:
    bool operator()(int A, int B)const  {return A < B;}
};
// Declaration of C++ sorting function.
template<class ComparisonFunctor>
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c)
{///buble sort
    for(int i=0; i<num_items; i++)
    {
        for(int j=num_items-1; j>i; j--)
        {
            if(c(begin_items[j],begin_items[j-1]))//=if(begin_items[j]<begin_items[j-1])
                swap(begin_items[j],begin_items[j-1]);
        }
    }
}

int main()
{
    GT gt;
    int b=gt(2);///此处将调用operator()
    cout << b << endl;

    int items[]={4, 3, 1, 2};
    compare_class functor;
    sort_ints(items, sizeof(items)/sizeof(items[0]), functor);
    for(size_t i=0; i<sizeof(items)/sizeof(items[0]); i++)
        cout<<items[i]<<" ";
    return 0;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章