博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lambda表达式
阅读量:6618 次
发布时间:2019-06-25

本文共 2401 字,大约阅读时间需要 8 分钟。

Lambda 表达式

flyfish 2014-10-10

Lambda 表达式也又称为 lambda,就像匿名函数,一个没有函数名字,仅仅有函数体
一 匿名函数到lambda表达式的转变
1  函数
int fun(int x, int y)
{
return x + y;
}  
2  将函数写成一行是:
int fun(int x, int y){ return x + y; }  
3  去掉函数名字之后是:
int (int x, int y) { return x + y; }
4  lambda表达式是:

auto n= [](int x, int y) { return x + y; };

lambda与普通函数的差别是没有函数名字了。多了一对方括号[]

建立windows控制台应用程序

函数式写法

#include "stdafx.h"#include 
int fun(int x, int y){ return x + y;} int _tmain(int argc, _TCHAR* argv[]){ std::wcout<
<
lambda表达式写法
#include "stdafx.h"#include 
int _tmain(int argc, _TCHAR* argv[]){ auto var= [](int x, int y) { return x + y; }; std::wcout<
<
通过对照,lambda能够实现函数的现写现用,是个语法糖。糖法糖(Syntactic sugar),是由英国计算机科学家Peter J. Landin发明的一个术语,指计算机语言中加入的某种语法,这样的语法对语言的功能并没有影响,可是更方便程序猿使用。

二 [ ] 捕获(capture)
1 通过值捕获局部变量a (capture a by value)

#include 
#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){ int a = 3; auto var = [a] (int x, int y){ return a + x + y; }; std::wcout <
<< std::endl;}
输出33
2 通过引用捕获局部变量a (capture a by reference)
#include 
#include "stdafx.h"int _tmain(int argc, _TCHAR* argv[]){ int a = 3; auto var = [&a] (int x, int y){ return a + x + y; }; a = 4; std::wcout <
<< std::endl;}

输出34, 通过引用捕获 a,当a被又一次赋值时就会影响该表达式的结果

捕获规则
仅仅有 在lambda 中使用的那些变量会被捕获
[]  不捕获不论什么变量
[&] 引用方式捕获全部在lambda 中使用的变量 
[=]  值方式捕获全部在lambda 中使用的变量
[=, &factor] 以引用捕获factor, 其余变量都是值捕获
[factor] 以值方式捕获factor; 不捕获其他变量
[factor1,&factor2] 以值方式捕获factor1; 以引用方式捕获factor2
[this] 捕获所在类的this指针
比如
auto var = [a] (int x, int y){ return a + x + y; };
可变为 
auto var = [=] (int x, int y){ return a + x + y; };
auto var = [&a] (int x, int y){ return a + x + y; };
可变为
auto var = [&] (int x, int y){ return a + x + y; };

3 捕获this指针,訪问类的成员变量

#include "stdafx.h"#include 
#include
#include
class CCalc {public: explicit CCalc(int nFactor) : m_nFactor(nFactor) { } void fun(const std::vector
& v) const { std::for_each(v.begin(), v.end(), [this](int n) { std::wcout << n * m_nFactor << std::endl; }); }private: int m_nFactor;};int _tmain(int argc, _TCHAR* argv[]){ std::vector
v; v.push_back(1); v.push_back(2); CCalc o(10); o.fun(v);}
输出10,20
以上程序在Visual C++2010下编译通过

转载于:https://www.cnblogs.com/gavanwanggw/p/6862118.html

你可能感兴趣的文章
【云图】如何设置微信里的全国实体店地图?
查看>>
db file async I/O submit 等待事件优化
查看>>
李开复谈未来工作:虽然会被AI取代,但谁说人类非得工作不可?
查看>>
PostgreSQL 空间切割(st_split)功能扩展 - 空间对象网格化
查看>>
Intercom的持续部署实践:一天部署100次,1次10分钟
查看>>
SpringBoot权限控制
查看>>
阿里云中间件技术 促进互联网高速发展
查看>>
智能时代悄然到来 物联网称王将引爆传感器产业
查看>>
物理隔离计算机被USB蜜蜂刺破 数据通过无线信号泄露
查看>>
利用一点机器学习来加速你的网站
查看>>
中国域名现状:应用水平较低,安全仍存隐患
查看>>
Java中HashMap的原理分析
查看>>
React Native入门项目与解析
查看>>
云计算:大势所趋 你准备好了么?
查看>>
数据资产的运营商--天市大数据交易平台
查看>>
中小企业如何成功转型跨境电商
查看>>
java中文乱码解决之道(二)—–字符编码详解:基础知识 + ASCII + GB**
查看>>
《ANTLR 4权威指南》——2.5 语法分析树监听器和访问器
查看>>
02_JNI中Java代码调用C代码,Android中使用log库打印日志,javah命令的使用,Android.mk文件的编写,交叉编译...
查看>>
这些国货,在阿里平台上被美国剁手党抢疯了
查看>>