函数对象(英文:function object),或称函数子(functionoid)或仿函数(functor),是能被调用的对象。从技术上说,函数对象是一个指定了特定类的对象,该类包含一个重载的operator()。这使得函数对象可以像函数一样被调用。
函数对象可以看作一种特殊的C++对象,它们可以像普通函数那样被调用,但可以携带一些状态和数据,这使得它们在某些场景中更加灵活和方便。函数对象广泛用于算法、STL容器、并行编程等领域。
函数对象的重载了()操作符,可以接受参数并返回结果。函数对象可以有多个重载版本,以应对不同的参数类型,从而实现多态。函数对象可以是类的成员函数,也可以是独立的全局函数或静态成员函数。
函数对象的一种常见用途是在标准库中的算法中使用,如STL中的sort(), find_if()等函数,这些函数参数都可以接受函数对象作为参数,用来指定特定的操作。
下面是一个示例,展示了如何定义和使用一个简单的函数对象:
#include <iostream>
class Adder {
public:
int operator()(int a, int b) {
return a + b;
}
};
int main() {
Adder add;
std::cout << add(2, 3) << std::endl; // 输出 5
return 0;
}
在上面的示例中,`Adder`是一个函数对象类,重载了`()`操作符。在`main()`函数中,我们创建了一个`Adder`对象`add`,并将它当作一个函数来调用,传入参数2和3,并输出结果5。
函数对象的优点是可以在函数调用前保存状态和数据,并且可以被其他对象或算法多次调用。这在一些需要持续追踪状态的情况下非常有用。另外,函数对象还可以作为参数传递给其他函数,实现更高级的功能。
总结来说,函数对象是一种能够像函数一样被调用的对象,可以携带状态和数据,并广泛应用于算法、STL容器等场景中。函数对象通过重载`()`操作符来实现调用,可以有多个重载版本以应对不同参数类型,具有更高的灵活性和功能扩展性。