回調函數基本介紹和基本使用場景
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的普通函數。
什麼是回調函數
通俗來說,回調函數就是用來給別人調用的函數,函數的編寫者只負責實現函數,不用去主動執行函數。下面舉個通俗的例子來說明什麼是回調函數。
拿移動公司的彩鈴來說,用戶可以定義彩鈴,彩鈴業務就是相當於回調函數;
用戶可以定義彩鈴的內容,即相當於可以實現回調函數的功能;
但是用戶並不能直接使用具體的彩鈴業務,移動公司會在來電時,直接播放用戶選定的彩鈴內容,即相當於調用回調函數。
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;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
3.回調函數的應用場景
回調函數一般適合於以下幾種場合:
事件驅動機制
為了簡單說明該機制,我們假定有兩個類,類A與類B。該模式的工作機制如下:
1.類A提供一個回調函數F,該回調函數執行根據不同的參數,執行不同的動作;
2.類A在初始化類B時,傳入回調函數F的函數指針pF;
3.類B根據需要在不同的情況下調用回調函數指針pF,這樣就實現了類B來驅動類A,類A來響應類B的動作。
通信協議的「推」模式
在我們實際工作中,經常會遇到數據通信的問題。總體來說,兩個對象要實現數據通信,有以下兩種方式:
1.「拉」模式
在該模式下,假定對象A要從對象B中獲取實時數據信息,「推」模式的工作機制如下:
(1)對象A開啟一個線程,該線程執行一個循環,每隔一定時間間隔,向對象B發出數據請求;
(2)對象B一旦有新的信息,就利用對象B的數據請求,將信息發送給對象B。
注意:該模式的主要問題是需要維護一個循環線程。時間間隔太長會導致,通信的實時性下降;時間間隔太短,會導致CPU浪費太多。
2.「推」模式
在該模式下,假定對象A要從對象B中獲取實時數據信息,「推」模式的工作機制如下:
(1)對象A在調用對象B時,向其傳遞一個回調函數;
(2)對象B一旦有新的信息,就調用對象A傳遞過來的函數指針,將最新的信息發送給對象A。
注意:該模式完美解決了「拉「模式產生的問題,不但保證了數據傳輸的實時性,而且降低了無用的CPU消耗。一般的通信協議,建議採用」推「模式。
TAG:程序員小新人學習 |