【C++】回調函數基本介紹和基本使用場景

轉載自:https://blog.csdn.net/u014337397/article/details/80328277

1.回調函數基本定義

  • 什麼是函數指針

    通俗來說,函數指針是一個指向特定函數的指針。函數的類型由其參數及返回類型共同決定,與函數具體名稱無關。示例代碼如下:
    int testFun1(int param1,long param2,float param3); //普通函數定義
    該函數的類型爲int(int,long,float),該類型的函數指針可以定義爲如下:
    int (*pTf)(int,long,float);

注意:

1.從上面的示例,可以看出,要聲明一個函數指針,只需要將普通函數名變爲指針,同時用()將指針名擴起來即可;

2.()是必不可少的。int pTf(int,long,float)表示的是一個返回值爲int的普通函數。

  • 什麼是回調函數

    通俗來說,回調函數就是用來給別人調用的函數,函數的編寫者只負責實現函數,不用去主動執行函數。下面舉個通俗的例子來說明什麼是回調函數。

    1.拿移動公司的彩鈴來說,用戶可以定義彩鈴,彩鈴業務就是相當於回調函數;
    2.用戶可以定義彩鈴的內容,即相當於可以實現回調函數的功能;
    3.但是用戶並不能直接使用具體的彩鈴業務,移動公司會在來電時,直接播放用戶選定的彩鈴內容,即相當於調用回調函數。

2.回調函數基本形式

回調函數是通過函數指針來實現。具體的示例示例如下:

#include "stdafx.h"
#include <iostream>  
using namespace std;

typedef int(*pFun)(int);     //定義一個函數指針類型 

//函數功能:回調函數測試函數
//參數:    pFun pCallback[IN]                     -- 函數指針,用於指針回調函數
//返回值:  無
void Caller(pFun pCallback)
{
    cout << "準備執行回調函數..." << endl;
    int ret = pCallback(1);
    cout << "函數處理結果:" << ret << endl;
}

//函數功能:真正的回調函數
//參數:    int iParam[IN]                     -- 輸入參數
//返回值:  int                                -- 執行結果
int realCallbackFun(int iParam)        
{
    cout << "進入回調函數..." << endl;
    return iParam + 1;
}

int main(int argc, char* argv[])
{
    Caller(realCallbackFun);

    getchar();
    return 0;
}

3.回調函數的應用場景

回調函數一般適合於以下幾種場合:

  • 事件驅動機制

    爲了簡單說明該機制,我們假定有兩個類,類A與類B。該模式的工作機制如下:
    1.類A提供一個回調函數F,該回調函數執行根據不同的參數,執行不同的動作;
    2.類A在初始化類B時,傳入回調函數F的函數指針pF;
    3.類B根據需要在不同的情況下調用回調函數指針pF,這樣就實現了類B來驅動類A,類A來響應類B的動作。

  • 通信協議的“推”模式

    在我們實際工作中,經常會遇到數據通信的問題。總體來說,兩個對象要實現數據通信,有以下兩種方式:
    1.“拉”模式(Pull)
    在該模式下,假定對象A要從對象B中獲取實時數據信息,“拉”模式的工作機制如下:
    (1)對象A開啓一個線程,該線程執行一個循環,每隔一定時間間隔,向對象B發出數據請求;
    (2)對象B一旦有新的信息,就利用對象A的數據請求,將信息發送給對象A。
    注意:該模式的主要問題是需要維護一個循環線程。時間間隔太長,會導致通信的實時性下降;時間間隔太短,會導致CPU浪費太多。
    2.“推”模式(Push)
    在該模式下,假定對象A要從對象B中獲取實時數據信息,“推”模式的工作機制如下:
    (1)對象A在調用對象B時,向其傳遞一個回調函數;
    (2)對象B一旦有新的信息,就調用對象A傳遞過來的函數指針,將最新的信息發送給對象A。
    注意:該模式完美解決了“拉“模式產生的問題,不但保證了數據傳輸的實時性,而且降低了無用的CPU消耗。一般的通信協議,建議採用”推“模式。

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