C++——回调函数

100 阅读2分钟

一、回调函数 (Callback Functions)

概念: 在编程中,回调函数就是将一个函数的指针像参数一样传递给另一个函数(不会自动调用),本质上是个业务场景

作用:

  • 解耦合 (Decoupling): 回调函数允许分离操作的执行者和操作的具体内容。调用者不需要知道被调用者具体做什么,只需要知道如何通知它完成。

  • 提升代码的灵活性和可扩展性: 通过传递不同的回调函数,我们可以让同一个函数执行不同的操作,而无需修改其内部代码。这就像你可以通过不同的“通知方式”(例如电话、短信)来接收外卖送达的消息。

示例代码:

#include <iostream>
#include <vector>
#include <algorithm>

// 回调函数:打印消息
void printMessage(int num) {
  std::cout << "回调函数被调用,数字为: " << num << std::endl;
}

// 回调函数:打印数字的平方
void printSquare(int num) {
  std::cout << "回调函数被调用,数字的平方为: " << num * num << std::endl;
}

// 接收回调函数指针作为参数的函数
void callFunction(void (*callback)(int), int num) {
  std::cout << "callFunction 正在执行,准备调用回调函数..." << std::endl;
  callback(num); // 调用传入的回调函数
  std::cout << "callFunction 执行完毕。" << std::endl;
}

// 一个更实际的例子:使用回调函数进行自定义排序
bool compareAscending(int a, int b) {
  return a < b;
}

bool compareDescending(int a, int b) {
  return a > b;
}

void sortNumbers(std::vector<int>& nums, bool (*compare)(int, int)) {
  std::sort(nums.begin(), nums.end(), compare);
}

int main() {
  // 将 printMessage 函数的指针传递给 callFunction
  callFunction(printMessage, 10);
  std::cout << std::endl;
  // 将 printSquare 函数的指针传递给 callFunction
  callFunction(printSquare, 5);
  std::cout << std::endl;

  // 使用回调函数进行排序
  std::vector<int> numbers = {3, 1, 4, 1, 5, 9, 2, 6};
  std::cout << "排序前:";
  for (int num : numbers) {
    std::cout << num << " ";
  }
  std::cout << std::endl;

  sortNumbers(numbers, compareAscending);
  std::cout << "升序排序后:";
  for (int num : numbers) {
    std::cout << num << " ";
  }
  std::cout << std::endl;

  sortNumbers(numbers, compareDescending);
  std::cout << "降序排序后:";
  for (int num : numbers) {
    std::cout << num << " ";
  }
  std::cout << std::endl;

  return 0;
}