日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

你会使用回调函数吗?

發布時間:2023/12/15 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 你会使用回调函数吗? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

之所以以反問的形式提出這個問題,是因為以我的觀點來看,“回調函數”對一個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

總結

以上是生活随笔為你收集整理的你会使用回调函数吗?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。