你会使用回调函数吗?
之所以以反問的形式提出這個問題,是因為以我的觀點來看,“回調函數”對一個C/C++程序員來說是很平常的,一些API的使用,一些接口的設計均要用到回調函數的概念。但是我面試過的一些有“多年工作經驗”的C系程序員,共事過的一些“有經驗”的同事竟然對回調函數不了解,更別提使用了。那今天我就以我的理解來梳理一下回調函數的概念和使用場景。
什么是回調函數?
維基百科釋義:
在計算機程序設計中,回調函數,或簡稱回調(Callback),是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。
不好理解吧?那舉個生活中常見的例子:你在網上買了東西通過快遞來配送,給你兩個選擇:
1. 你可以一遍遍的打快遞配送公司的電話,查詢你的貨是否到了,是否可以領取;
2. 你可以安心的干自己的事,等配送人員把貨送到你家門口打電話通知你,你去領取;
你會選擇哪種方式處理?當然你會選擇第二鐘處理方式,好處不言而喻,這也正是回調函數的形象解釋。
回調函數的實現原理
對于C/C++語言來說就是將函數指針作為參數傳遞給其它函數。
回調函數實例
#include <iostream> using namespace std; void Sum(int a, int b) {int c = a + b;cout << "Sum = " << c << endl; } typedef void (*FuncCallBack)(int, int); void GetCallBack(const int i, FuncCallBack cb) {if (1 == i){cb(3, 4);} } void main() {GetCallBack(1, Sum);system("pause"); }運行結果:Sum = 7 ?,對于上面這個例子FuncCallBack就是回調函數的定義,Sum是其實現
另外,在C++的接口設計里常常會遇到這種情況:需要向類接口中注冊很多不同的回調函數,這樣這些回調函數的定義和管理便比較雜亂,這樣我們可以借用delegate類的概念來這么實現回調。
#include <iostream> using namespace std; class IEvent { public:virtual void Test1(int i) = 0;virtual void Test2(int i) = 0;virtual void Test3(int i) = 0; }; class TestEvent:public IEvent { public:void Test1(int i) { cout << "Test1 : " << i << endl;}void Test2(int i) { cout << "Test2 : " << i << endl;}void Test3(int i) { cout << "Test3 : " << i << endl;} private:int p; }; class NotifyEvent { public:void Run(int flag){switch(flag){case 1:testEvent_->Test1(1);break;case 2:testEvent_->Test2(2);break;case 3:testEvent_->Test3(3);break;default:break;}}void SetMyEvent(IEvent* testEvent) {testEvent_ = testEvent;} private:IEvent* testEvent_; }; int _tmain(int argc, _TCHAR* argv[]) {IEvent* ptr_event = new TestEvent;NotifyEvent notifyEvent;notifyEvent.SetMyEvent(ptr_event);notifyEvent.Run(1);notifyEvent.Run(3);system("pause");return 0; }運行結果:Test1 : 1 ? ?Test3 : 3
對于接口使用者而言,暴露出了IEvent這個接口,回調的管理都在這個接口中,避免了上述管理雜亂的情況。
轉載于:https://blog.51cto.com/yaocoder/1221422
總結
以上是生活随笔為你收集整理的你会使用回调函数吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 尚勇:恶劣国际环境倒逼中国加快补上短板弱
- 下一篇: 阿里本地生活板块被爆大裁员,饿了么到店业