當前位置:
首頁 > 知識 > 回調函數基本介紹和基本使用場景

回調函數基本介紹和基本使用場景

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消耗。一般的通信協議,建議採用」推「模式。

回調函數基本介紹和基本使用場景

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

Go 中 JSON 的序列化和反序列化

TAG:程序員小新人學習 |