c++中如何使用函数指针 实现回调函数【c++进阶】

12次阅读

函数指针是存储函数入口地址的变量,用于通过指针调用函数;回调函数是作为参数传入并在适当时机被调用的普通函数,依赖函数指针实现。

c++中如何使用函数指针 实现回调函数【c++进阶】

什么是函数指针和回调函数

函数指针就是指向函数入口地址的变量,它能存储函数名(本质是地址),之后通过该指针调用函数。回调函数不是某种特殊函数,而是“被作为参数传给另一个函数,并在适当时候被调用”的普通函数——这个“传入并被调用”的机制,就靠函数指针来实现。

声明与定义函数指针类型

函数指针的声明要严格匹配目标函数的签名(返回类型、参数个数和类型)。例如:

int func(int a, double b); 的对应函数指针类型写法有多种:

  • 直接声明:int (*pf)(int, double);
  • typedef 简化:typedef int (*FuncPtr)(int, double); FuncPtr pf;
  • c++11 起推荐用 usingusing FuncPtr = int(*)(int, double);

注意括号不能省: int *pf(int, double) 是函数声明(返回 int*),不是函数指针。

立即学习C++免费学习笔记(深入)”;

把函数指针作为参数实现回调

这是最典型的回调场景:一个处理函数接受函数指针,在内部某个时机调用它。

比如写一个通用排序后遍历打印的工具

void process_sorted(int arr[], int n, void (*callback)(int)) {     std::sort(arr, arr + n);  // 先排序     for (int i = 0; i < n; ++i) {         callback(arr[i]);  // 回调:对每个元素执行用户自定义操作     } }

使用时传入具体函数名(即地址):

  • void print_square(int x) { std::cout
  • process_sorted(data, 5, print_square);

进阶:带状态的回调(捕获上下文)

纯函数指针无法携带额外数据(如配置、对象实例)。常见解决方式有两种:

  • 加 void* 参数:C 风格兼容方案。目标函数多一个 void* userdata 参数,调用方传入任意指针,回调里再 reinterpret_cast 回原类型
  • 用 std::function + lambda(更现代 C++ 推荐):std::function callback 可绑定 lambda、成员函数或普通函数,天然支持捕获局部变量

例如用 lambda 实现带偏移量的打印:

int offset = 10; process_with_func(data, 5, [offset](int x) { std::cout << x + offset << " "; });

这时函数参数类型需改为 std::function,底层仍可能用函数指针优化,但接口更灵活安全。

text=ZqhQzanResources