前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Cpp1-lambda由浅入深学习lambda表达式

Cpp1-lambda由浅入深学习lambda表达式

原创
作者头像
fieldli
修改2019-01-23 20:24:07
5150
修改2019-01-23 20:24:07
举报
文章被收录于专栏:大块小屋-技术大块小屋-技术

首先以一个求圆的面积说起。求圆的面积需要两个参数,PI和半径。

1.普通函数

很容易想到下面的实现方式:

代码语言:javascript
复制
 //普通函数实现求圆面积
 double CircleArea(const double& pi,const double& r)
 {
    return r*r*pi;
 }
int main(int argc,char** argv)
{
    double pi = 3.14;
    double r = 2.0;
    cout<<"普通函数:" <<CircleArea(pi,r)<<endl;
}

这种方式实现有啥问题呢?我们要定义一个pi,每次使用这个函数的时候,我都要重新定义一次。而且看起来很丑。当然我们可以直接把pi'定义为一个宏来全局使用。还有其他的方式吗?我们来试一下仿函数的是实现方式:

2.仿函数

代码语言:javascript
复制
//仿函数
class CircleAreaObj
{
public:
    virtual ~CircleAreaObj(){};
    double operator()(double r)
    {
        return r*r*pi;
    };
private:
    double pi=3.14;

};
int main(int argc,char** argv)
{
     //仿函数
    double r = 2.0;
    CircleAreaObj ca;
    cout<< "仿函数:" <<ca(r)<<endl;
}

注意下,这里定义了一个类,并对()进行了重载。在使用的时候,直接用对象名加括号的形式就可以调用了。

这样就把pi这个变量隐藏到类里了。调用的时候不用关注pi这个变量了。通过类的使用变量来存储一些信息,通过重运算符()来达到函数调用的效果。这就是仿函数,本质上就是一个类。

3.lambda表达式

代码语言:javascript
复制
int main(int argc,char** argv)
{
   //lambda
   double pi = 3.14;
    double r = 2.0;
    auto CircleAreaLambda = [pi](double r) -> double{return r*r*pi;};
    cout<< "lambda:" <<CircleAreaLambda(r)<<endl;
}

lambda表达式更简洁,lambda表达式与仿函数的使用效果是一样。lambda表达式原理也是与仿函数一样的。

一线互联网从业人员,欢迎关注公众号:大块小屋。不保证字字珠玑,但能保证每一句话都是经过深入思考。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.普通函数
  • 2.仿函数
  • 3.lambda表达式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档