在c++中,operator()是用于重载函数调用运算符的语法,通过它定义的函数也被叫做函数调用运算符重载函数。使用该运算符重载的类或结构体的对象可像函数一样被调用,这样的对象被称为 “函数对象”(也叫 “仿函数”)。主要作用如下:
<1>自定义排序规则
#include <iostream>
#include <algorithm>
#include <vector>
// 自定义比较函数对象,用于降序排序
struct Greater {
bool operator()(int a, int b) {
return a > b;
}
};
int main() {
std::vector<int> numbers = {3, 1, 4, 1, 5, 9};
// 使用 Greater 函数对象进行降序排序
std::sort(numbers.begin(), numbers.end(), Greater());
for (int num : numbers) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}
<2>封装可调用行为
#include <iostream>
// 定义一个计数器函数对象
struct Counter {
int count = 0;
// 重载函数调用运算符
void operator()() {
count++;
std::cout << "调用次数: " << count << std::endl;
}
};
int main() {
Counter counter;
counter(); // 第一次调用
counter(); // 第二次调用
return 0;
}
<3>适配算法和数据结构
#include <iostream>
#include <queue>
#include <vector>
// 自定义比较函数对象,实现小顶堆
struct Compare {
bool operator()(int a, int b) {
return a > b;
}
};
int main() {
std::priority_queue<int, std::vector<int>, Compare> pq;
pq.push(3);
pq.push(1);
pq.push(2);
std::cout << "队首元素: " << pq.top() << std::endl;
return 0;
}
<4>作为回调函数
#include <iostream>
// 定义一个函数对象
struct Print {
void operator()(int num) {
std::cout << "打印数字: " << num << std::endl;
}
};
// 接受回调函数的函数
void process(int num, Print callback) {
callback(num);
}
int main() {
int number = 42;
Print printer;
process(number, printer);
return 0;
}