C++函数指针及其用途详解


前言

在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语言的库函数。

函数指针的常见用途总结

  1. 回调机制:将函数作为参数传递(如事件处理)。
  2. 策略模式:运行时动态选择算法。
  3. 函数表/跳转表:通过索引或键快速调用不同函数。
  4. 兼容C代码:与C语言库交互时传递函数。
  5. STL算法:为泛型算法提供自定义行为(如排序规则)。
  6. 插件系统:动态加载并调用函数。

注意事项

  • 类型严格匹配:函数签名(参数和返回值)必须完全一致。
  • 成员函数:普通函数指针不能指向类成员函数(需使用std::function或成员函数指针)。
  • 现代C++替代:优先考虑std::function和Lambda(支持捕获上下文),但函数指针在低级场景仍有用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值