什么是回调函数?
回调函数就是一个通过函数指针调用的函数。
如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
以上来自百度百科,读着很是拗口。
先请看图:
模块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;
}