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的话,则无法进行调用。