一、回调函数 (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;
}