前言
在C++中,函数指针是一种指向函数而非数据的指针,允许通过指针间接调用函数。以下是详细的说明和示例:
一、函数指针的基本用法
声明与赋值
// 声明函数指针类型(接受两个int参数,返回int)
typedef int (*MathFunc)(int, int);
// 普通函数
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main() {
MathFunc func = &add; // 或直接 func = add;
cout << func(3, 5) << endl; // 输出 8
func = subtract;
cout << func(5, 3) << endl; // 输出 2
return 0;
}
- 用途:动态切换函数实现。
二、作为函数参数(策略模式)
// 接收函数指针作为参数
int compute(MathFunc func, int x, int y) {
return func(x, y);
}
int main() {
cout << compute(add, 5, 3) << endl; // 输出 8
cout << compute(subtract, 5, 3) << endl; // 输出 2
return 0;
}
- 用途:实现策略模式,允许运行时选择算法。
三、回调函数
// 模拟事件处理器
void onEvent(const string& msg, void (*callback)(const string&)) {
callback("事件触发: " + msg);
}
void logCallback(const string& msg) {
cout << "[日志] " << msg << endl;
}
int main() {
onEvent("按钮点击", logCallback); // 输出 [日志] 事件触发: 按钮点击
return 0;
}
- 用途:GUI事件处理、异步通知。
四、函数表(动态分发)
// 函数表示例
MathFunc funcTable[] = {add, subtract};
int main() {
int choice = 0; // 0表示加法,1表示减法
int a = 10, b = 5;
int result = funcTable[choice](a, b);
cout << "结果: " << result << endl; // 输出 15
return 0;
}
- 用途:状态机、命令模式。
五、与STL算法结合
#include <algorithm>
#include <vector>
bool compare(int a, int b) {
return a > b; // 降序排序
}
int main() {
vector<int> nums = {3, 1, 4, 1, 5};
sort(nums.begin(), nums.end(), compare);
// nums变为 {5, 4, 3, 1, 1}
return 0;
}
- 用途:自定义排序、谓词函数。
六、与C库交互
// 模拟C库的qsort函数
extern "C" void qsort(void* base, size_t num, size_t size,
int (*compar)(const void*, const void*));
int intCompare(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int main() {
int arr[] = {5, 3, 7, 1};
qsort(arr, 4, sizeof(int), intCompare); // 排序后为 {1, 3, 5, 7}
return 0;
}
- 用途:兼容C语言的库函数。
函数指针的常见用途总结
- 回调机制:将函数作为参数传递(如事件处理)。
- 策略模式:运行时动态选择算法。
- 函数表/跳转表:通过索引或键快速调用不同函数。
- 兼容C代码:与C语言库交互时传递函数。
- STL算法:为泛型算法提供自定义行为(如排序规则)。
- 插件系统:动态加载并调用函数。
注意事项
- 类型严格匹配:函数签名(参数和返回值)必须完全一致。
- 成员函数:普通函数指针不能指向类成员函数(需使用std::function或成员函数指针)。
- 现代C++替代:优先考虑std::function和Lambda(支持捕获上下文),但函数指针在低级场景仍有用。