c++函数指针怎么用 c++回调函数实现方法【教程】

函数指针用于存储函数地址以实现运行时动态调用和回调机制,声明需严格匹配函数签名,如int (*funcPtr)(int, int) = add;,并支持forEach等回调场景。

函数指针在C++中主要用于存储函数地址,从而实现运行时动态调用、解耦逻辑,是实现回调机制的核心工具。它不难,但细节容易出错,比如类型匹配、调用语法、与lambda或成员函数的兼容性等。

函数指针的基本声明和使用

函数指针的类型必须和目标函数的签名(返回值类型 + 参数列表)完全一致。声明格式为:返回类型 (*指针名)(参数类型...)

例如,有一个普通函数:

int add(int a, int b) { return a + b; }

对应函数指针可这样定义和使用:

  • int (*funcPtr)(int, int) = add; // 指向add的函数指针
  • int result = funcPtr(3, 5); // 调用:等价于 add(3, 5)

用函数指针实现简单回调

回调的本质是把一个函数作为参数传给另一个函数,后者在合适时机“回头调用”它。函数指针是最直接的支持方式。

比如写一个通用的遍历处理函数:

void forEach(int arr[], int size, void (*callback)(int)) {
  for (int i = 0; i     callback(arr[i]);
  }
}

调用时传入具体行为:

void printSquare(int x) { cout int nums[] = {1, 2, 3};
forEach(nums, 3, printSquare); // 输出:1 4 9

注意成员函数不能直接赋给普通函数指针

类的非静态成员函数隐含 this 参数,签名不匹配。要调用成员函数作回调,有几种常用方式:

  • std::function + std::bind(推荐,灵活且类型安全)
  • 用静态成员函数或全局函数包装(需手动传 this
  • C++11起支持 lambda 捕获后转成 std::function,更简洁

例如:

class Printer { public: void log(int x) { cout Printer p;
std::function cb = [&p](int x) { p.log(x); };
forEach(nums, 3, cb);

现代C++更推荐 std::function 替代裸函数指针

std::function 是类型擦除的可调用对象包装器,能容纳函数指针、lambda、绑定表达式、甚至重载了 operator() 的类对象,语义更清晰,也避免了函数指针复杂的声明语法。

改写前面的 forEach

void forEach(int arr[], int size, std::function callback) { ... }

调用方式不变,但扩展性更强,也不用担心类型声明写错。