C++回調函數相關
1. 首先還是由最基本的"Hello World!"程序引入
#include <iostream>
int main()
{
std::cout << "Hello World!" << std::endl;
return 0;
}
2. 接下來實現一個簡單的函數調用輸出"Hello World!"
#include <iostream>
void sayHello(string s)
{
std::cout << s << std::endl;
}
int main()
{
sayHello("Hello World!");
return 0;
}
3. 接下來說明一下有關于函數類型這一概念
所謂的函數的類型,包含了兩個部分(它的申明類型和調用所需的形參列表),如對我們上文中的sayHello為例,sayHello函數的類型就為"void (string)"
有了對函數類型的理解,接著我們就可以申明一個指向函數的指針,以sayHello函數為例:
void (*fp) (string); // fp為void (string)類型的指針,還未指向相應的對象
fp = sayHello;
通過調用fp完成輸出"Hello World!"代碼如下:
#include <iostream>
void sayHello(string s)
{
std::cout << s << std::endl;
}
int main()
{
//void (*fp) (string); // 聲明一個函數指針
fp = sayHello;
auto fps = sayHello; // c++11新用法
fp("Hello ");
fps("World!");
return 0;
}
上述代碼還是補充了C++11的新特性auto,有興趣可以自己去了解一下
4. 下面就可以很容易的理解回調函數的概念了
所謂回調函數,簡單的說就是對于一個現有系統所提供的接口,用戶可以自行定義一個函數作為其形參,以函數指針的形式傳入,而具體在合適使用該自定義函數由系統接口內部自行決定
再形象一點地說,你去飯店預訂餐桌,留下手機號,你的手機號就是所謂的回調函數,有餐桌則通過手機號與你聯系,這就是調用回調函數
下面給出簡單的利用回調函數"Hello World"
#include <iostream>
void sayHello(string s)
{
std::cout << s << std::endl;
}
void callback(void (*callfunc)(string), string s)
{
callfunc(s);
}
int main()
{
auto fps = sayHello; // c++11新用法
callback(fps, "this is callback func!");
return 0;
}
這里需要注意的的是,在sayHello函數中是有參數string s需要傳入的,callback函數的第一個參數只是一個指向sayHello函數內存地址的函數指針,其并不帶參數,如果callback沒有第二個參數string s的話,則無法進行調用。