C++基础整理(8)之函数指针与回调函数
注:整理一些突然学到的C++知识,随时mark一下
例如:忘记的关键字用法,新关键字,新数据结构
C++ 的函数指针/回调函数
提示:本文为 C++ 中 函数指针、回调函数 的用法和举例
一、函数指针
在C++中,函数指针是一个指向函数的指针,它存储了函数的地址而不是函数的返回值。函数指针的主要用途是允许程序员在运行时动态地调用不同的函数,或者将函数本身作为参数传递给其他函数。
1、函数指针的声明和初始化
声明函数指针的格式是return_type (*funPtr)(paras_type)
,即用(*函数指针的名字)
代替原函数定义时给函数取的名字,然后参数列表中只写参数的数据类型。
以下是一个简单的定义声明一个指向无参数、无返回值函数的指针:
void (*functionPtr)();
functionPtr = myfun;//初始化这个函数指针,赋以已经定义的函数myfun
如果函数接受参数或返回值,你需要在函数指针的定义中包括这些参数和返回类型。
例如,指向接受一个整数参数并返回整数的函数的指针的定义:
int (*functionPtrWithInt)(int);
functionPtrWithInt = myfun2;//初始化这个函数指针,赋以已经定义的函数myfun2
注意,以上在C++引入<functional>
库后也可以写成:std::function<int(int)> functionPtrWithInt = myfun2
;这个功能更加灵活。
2、使用 typedef 定义函数指针的类型
可以将函数指针当成一个新的数据类型,这时仅需将函数指针的声明格式前面加一个 typedef 即可,注意这时括号内的FunctionPtr不再是一个函数指针,而是一个函数指针的类型。
以下是个示例可以比较一下与刚才函数指针初始化的区别。
// 使用typedef定义函数指针类型
typedef int (*FunctionPtr)(int);
// 用这个类型声明一个函数指针变量
FunctionPtr fPtr;
// 初始化这个函数指针,赋以已经定义的函数myfun2
fPtr = myfun2;
注意以上写法在C++中也可以用关键字 using 代替:
// 使用using定义函数指针类型
using FunctionPtr = int (*)(int);
注意:int (*s[N])(int)
表示一个函数指针的数组,N个元素都是函数指针,且每个指针都指向某个参数是int,返回是int的函数(不一定是同一个函数)。
3、函数指针的用途
(1)回调函数:在异步编程或事件驱动编程中,我们常常需要将函数指针作为回调,以便在某个事件发生时调用特定的函数。
(2)将函数作为参数传递,因为函数名在大多数情况下会被解释为指向该函数的指针,所以能够直接将函数名作为参数传递给接受函数指针的函数。
(3)函数表:可以创建函数指针数组(或称为函数表),以在运行时根据某些条件选择并执行不同的函数。
(4)高级功能:如虚函数表(在C++的对象模型中用于实现多态)、信号处理函数等内部机制都依赖于函数指针。
4、通过函数指针将函数作为参数传递
下面是一个简单的例子,展示了如何将函数作为参数传递:
// 定义一个函数,它接受一个函数指针作为参数
void callFunction(void (*func)()) {
func(); // 调用传入的函数
}
// 定义一个普通的函数
void sayHello() {
std::cout << "Hello from sayHello!" << std::endl;
}
int main() {
// 将函数名(它隐式地转换为函数指针)作为参数传递给callFunction
callFunction<