1、C++98 的函数对象
从概念上来说,函数对象是一个可以被当作函数来用的对象。它有时也会被叫做 functor,代码看一个函数对象:
struct CAverage
{
public:
double operator()(int a1, int a2)
{ //重载()运算符
return (double)(a1 + a2) / 2;
}
};
int main()
{
CAverage average;
std::cout << average(3, 2); //等价于 cout << average.operator(3, 2, 3);
return 0;
}
它看起来相当普通,唯一有点特别的地方就是定义了一个 operator(),这个运算符允许我们像调用函数一样使用小括号的语法。
2、Lambda 表达式
先看一个例子:
int main()
{
int a = 10;
std::cout << [a](int x,int y) { return (double)(x + y + a) / 2; }(1,2); //输出 6.5
getchar();
return 0;
}
理解它只需要注意下面几点:
(1)Lambda 表达式以一对中括号开始,通过 =(值捕获),&(引用捕获)获取函数体内可以使用的参数,或者直接指定变量名称
(2)跟函数定义一样,小括号指定参数列表
(3)跟正常的函数定义一样,我们会有一个函数体,里面会有 return 语句
(4)Lambda 表达式一般不需要说明返回值(相当于 auto);有特殊情况需要说明时,则应使用箭头语法的方式:[](int x) -> int { … }
(5)每个 lambda 表达式都有一个全局唯一的类型,要精确捕捉 lambda 表达式到一个变量中,只能通过 auto 声明的方式
3、如何理解lambda 表达式都有一个全局唯一的类型?
上面的Lambda表达式例子相当于编译器生成如下代码:
struct lambda_ab123gt {
lambda_ab123gt(int n) : n_{ n } {}
auto operator()(int x, int y) const
{
return (double)(x + y + n_) / 2;
}
private:
int n_;
};
int main()
{
int a = 10;
std::cout << lambda_ab123gt(a)(1,2); //输出 6.5
getchar();
return 0;
}