首先以一个求圆的面积说起。求圆的面积需要两个参数,PI和半径。
很容易想到下面的实现方式:
//普通函数实现求圆面积
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'定义为一个宏来全局使用。还有其他的方式吗?我们来试一下仿函数的是实现方式:
//仿函数
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这个变量了。通过类的使用变量来存储一些信息,通过重运算符()来达到函数调用的效果。这就是仿函数,本质上就是一个类。
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 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有