什麼是回調函數?
回調函數就是一個通過函數指針調用的函數。
如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用爲調用它所指向的函數時,我們就說這是回調函數。
回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
以上來自百度百科,讀着很是拗口。
先請看圖:
模塊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;
}