函数对象是通过重载operator()的类对象,可像函数一样调用并保存状态。例如AddValue类通过operator()实现加法操作,支持内联优化和STL算法集成,相比函数指针更灵活高效。

在C++中,函数对象(也称为仿函数,functor)是通过重载调用运算符 operator() 的类对象。它允许对象像函数一样被调用,同时具备比普通函数更强的灵活性,比如可以保存状态信息。
调用运算符 operator() 是C++中可以被重载的运算符之一。它使得类的实例能够像函数一样使用括号语法进行调用。
例如,如果你有一个类 MyFunctor,并重载了 operator(),那么你可以像调用函数一样使用该类的对象:
MyFunctor f; f(10); // 实际上调用的是 f.operator()(10)
下面是一个简单的例子,展示如何通过重载 operator() 创建函数对象:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
using namespace std;
class AddValue {
private:
int bias;
public:
AddValue(int b) : bias(b) {}
// 重载调用运算符
int operator()(int x) {
return x + bias;
}
};
int main() {
AddValue add5(5); // 创建函数对象,偏移量为5
cout << add5(10) << endl; // 输出 15
return 0;
}
在这个例子中,add5 是一个函数对象,它“记住”了偏移值 5,并在每次调用时使用它。
相比普通函数或函数指针,函数对象有以下几个优点:
例如,使用函数对象自定义排序规则:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Greater {
bool operator()(int a, int b) {
return a > b;
}
};
int main() {
vector<int> vec = {3, 1, 4, 1, 5};
sort(vec.begin(), vec.end(), Greater());
for (int x : vec) cout << x << " ";
// 输出:5 4 3 1 1
return 0;
}
C++11引入了lambda表达式,它本质上是编译器自动生成的函数对象。例如:
auto add = [](int x, int y) { return x + y; };
cout << add(3, 4) << endl; // 输出 7
lambda让创建函数对象更加简洁,但在需要复用或携带状态时,手动定义函数对象仍有其价值。
基本上就这些。重载 operator() 是实现函数对象的核心,它让对象具备函数行为,是泛型编程和STL的重要基础。掌握它有助于写出更灵活、高效的C++代码。
以上就是C++函数对象 重载调用运算符的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号