一,函数对象
1.函数对象的概念
函数对象可以像函数那样被直接调用。
函数对象(function objects)又被称为仿函数(functors)。
函数对象可以被当作一个值赋给另一个变量,也可以作为实参传递给其他函数,或者作为其他函数的返回结果。
函数对象与函数指针相似,函数对象的行为和函数差不多,但是与函数指针不同的是,函数对象是完整的类对象,里面包含着成员变量和多个成员函数。
函数对象的用法如下:
//class可以换成struct
class FunctionObjName
{
public:
ReturnType operator()(ParamType1, ... , ParamTypeN){
process code
}
};
2.函数对象的应用
函数对象的实现,本质上是在类中完成函数调用运算符的重载。因此,使用函数对象的重点在于重载"operator()"。
使用函数对象的步骤:
step.01: 新建一个类,在类中定义一个重载的函数调用运算符
class Less
{
public:
bool operator()(int a,int b) const;
};
//Less类的成员函数:函数调用运算符operator()
step.02: 定义函数运算符operator()的具体操作
bool Less::operator()(int a, int b) const
{
return a < b;
}
step.03: 新建一个函数对象,并像调用函数一样调用函数对象
Less less_obj;
const bool_is_less = less_obj(5, 6);
3.标准库中的函数对象
STL标准库中提供了很多函数对象的类模板,它们都包含在头文件functional中。
例如上面提到的Less类,可以使用标准库中的"std::less<int>less"。从C++14标准开始,可以省略类型实参,例如"std::less<>less"。
标准库中常见的函数对象:
调用方式样例:
//方式一,直接调用
std::cout << std::plus<int>()(4, 5) << std::endl;
//方式二,实例化一个新的类,然后调用
std::plus<int> plus_obj;
std::cout << plus_obj(4, 5) << std::endl;
4.函数对象的传参
关于调用的时候传参,使用函数指针的开发场景更多时候是通过回调函数(超链接)来实现的,但是使用函数对象的开发场景有更加简洁的传参方式,它可以将用户传的参数放在对象的成员变量中。
代码样例:
#include <cmath>
class Nearer
{
public:
Nearer(