定義
回調函數就是一個經過
函數指針調用的
函數。若是你把函數的
指針(地址)做爲
參數傳遞給另外一個函數,當這個指針被用爲調用它所指向的函數時,咱們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
實現的機制
[1]定義一個回調函數;
[2]提供函數實現的一方在初始化的時候,將回調函數的函數
指針註冊給調用者;
[3]當特定的事件或條件發生的時候,調用者使用
函數指針調用回調函數對事件進行處理。
使用優勢
由於使用此函數能夠把調用者與被調用者分開,因此調用者不關心誰是被調用者。它只需知道存在一個具備特定原型和限制條件的
被調用函數。簡而言之,回調函數就是容許用戶把須要調用的方法的指針做爲參數傳遞給一個函數,以便該函數在處理類似事件的時候能夠靈活的使用不一樣的方法。
想知道回調函數在實際中有什麼做用?先假設有這樣一種狀況:咱們要編寫一個庫,它提供了某些
排序算法的實現(如
冒泡排序、
快速排序、
shell排序、shake排序等等),爲了能讓庫更加通用,不想在函數中嵌入排序邏輯,而讓使用者來實現相應的邏輯;或者,能讓庫可用於多種
數據類型(int、float、string),此時,該怎麼辦呢?可使用
函數指針,並進行回調。
回調可用於通知機制。例如,有時要在A程序中設置一個
計時器,每到必定時間,A程序會獲得相應的通知,但通知機制的實現者對A程序一無所知。那麼,就需一個具備特定原型的
函數指針進行回調,通知A程序事件已經發生。實際上,
API使用一個回調函數SetTimer()來通知
計時器。若是沒有提供回調函數,它還會把一個消息發往程序的
消息隊列。
另外一個使用回調機制的API函數是EnumWindow(),它
枚舉屏幕上全部的頂層窗口,每一個窗口均可以經過它調用另外一個程序提供的函數,並傳遞窗口的處理程序。例如:若是被調用者返回一個值,就繼續進行迭代;不然,退出。EnumWindow()並不關心被調用者在何處,也不關心被調用者用它傳遞的處理程序作了什麼,它只關心返回值,由於基於返回值,它將繼續執行或退出。
無論怎麼說,回調函數是繼承自C語言的。在C++中,應只在與C代碼創建接口或與已有的回調接口打交道時,才使用回調函數。除了上述狀況,在C++中應使用虛擬方法或
仿函數(functor),而不是回調函數。