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