回調函數就是一個通過函數指針調用的函數。如果你把函數的指針(地址)作為參數傳遞給另一個函數,當這個指針被用來調用其所指向的函數時,我們就說這是回調函數。回調函數不是由該函數的實現方直接調用,而是在特定的事件或條件發生時由另外的一方調用的,用於對該事件或條件進行響應。
一、普通函數和回調函數
普通的函數一般包括函數名和函數實現這兩部分,並且這兩部分是固定好的,也就是說我們調用這個函數實現的功能是明確的、是唯一的(只提供了一種功能)
然后在使用的時候,調用該函數名+(...)就可以使用這個功能,括號很重要、很重要、很重要。。。。。。
還有就是普通的函數不能作為參數一樣被傳遞,只能通過函數名+(...)的形式被使用
回調函數還是一個函數,它也是有函數名和函數實現這兩個部分組成,區別在回調函數是可以被當作參數一樣被傳遞(可移動的),
當回調函數被當作參數傳遞時,相當於一個指向函數的一個指針(函數指針),回調函數的函數名就是一個函數指針,注意不能帶括號
在需要用到回調函數的功能的時候,就可以通過函數名+()的形式去使用
這么一對比,好像回調函數除了能作為參數一樣被傳遞,和普通函數也沒啥區別,但是使用起來很靈活
C++中的多態是通過虛函數和繼承來實現的,但是在C語言中沒有多態的概念,就是通過回調函數實現類似多態的功能
1、主函數需要調用回調函數
2、中間函數登記回調函數
3、觸發回調函數事件
4、調用回調函數
5、響應回調事件
回調函數的簡單案例
#include <iostream> #include <vector> #include <algorithm> #include<stack> #include<math.h> #include<string> #include<string.h> using namespace std; //定義一個函數指針,這個函數指針的類型名叫callback,它指向的函數返回值為void,調用的參數為void typedef void(*callback)(void); //定義命令結構體 typedef struct cmd { string name; //命令的名字 callback func; //與命令相對應的函數指針 cmd(string A, callback B) { name = A, func = B; } }cmd_t; //響應回調函數,實現回調函數的功能 void hello() { printf("hello\n"); } void hi() { printf("hi\n"); } void exit() { exit(0); } //中間函數登記回調函數 void cmd_hello() { hello(); } void cmd_hi() { hi(); } void cmd_exit() { exit(); } //回調函數登記表 const cmd_t cmd_table[] = { {"hello",cmd_hello}, {"hi",cmd_hi}, {"exit",cmd_exit} }; //查找命令 cmd_t* my_find(string val) { for (int i = 0; i < sizeof(cmd_table)/sizeof(cmd_t); i++) { if (val==cmd_table[i].name) { cmd_t* temp = new cmd_t(cmd_table[i].name, cmd_table[i].func); return temp; } } return NULL; } int main() { string val; cmd_t *cmd_ptr; while (1) { cin>>val; cmd_ptr = my_find(val); //觸發回調事件 if (cmd_ptr) { //調用回調函數 cmd_ptr->func(); } else { printf("ERROR ,NO THIS CMD\n"); } } return 0; }