回調函數

什麼是回調函數?

回調函數就是一個通過函數指針調用的函數

如果你把函數的指針(地址)作爲參數傳遞給另一個函數,當這個指針被用爲調用它所指向的函數時,我們就說這是回調函數。

回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。

以上來自百度百科,讀着很是拗口。

先請看圖:


模塊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;
}




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