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

函数指针在C++中主要用于存储函数地址,从而实现运行时动态调用、解耦逻辑,是实现回调机制的核心工具。它不难,但细节容易出错,比如类型匹配、调用语法、与lambda或成员函数的兼容性等。
函数指针的基本声明和使用
函数指针的类型必须和目标函数的签名(返回值类型 + 参数列表)完全一致。声明格式为:返回类型 (*指针名)(参数类型...)。
例如,有一个普通函数:
int add(int a, int b) { return a + b; }
立即学习“C++免费学习笔记(深入)”;
对应函数指针可这样定义和使用:
- 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
forEach(nums, 3, cb);
现代C++更推荐 std::function 替代裸函数指针
std::function 是类型擦除的可调用对象包装器,能容纳函数指针、lambda、绑定表达式、甚至重载了 operator() 的类对象,语义更清晰,也避免了函数指针复杂的声明语法。
改写前面的 forEach:
void forEach(int arr[], int size, std::function
调用方式不变,但扩展性更强,也不用担心类型声明写错。











