Lambda是C++11特性,用于创建匿名函数,匿名函数即只拥有函数体,但是没有函数名。

你可以把他理解为一小段代码,但是又不需要像函数哪有,执行函数现场保护。

推出这种表达式主要目的是为了解决一次性函数,如当我们在编写一段代码想要处理某些事情得时候,我们需要编写一段代码,其中有一段代码下面是要可以复用的,但是它只限于当前函数使用,一次性的函数,如果为其单独编写一个函数未免有些浪费资源,和编写一些无用代码,但是不写的话,下面又要重写一段与上面一样的代码。

这个时候,Lambda就诞生了,在这种情况下我们可以使用Lambda表达式来完成复用代码,编写一次性的函数。

先看一下Lambda表达式原型:

[捕获方式] (参数)  {函数体}

首先介绍一下捕获方式:

[]:
没有任何捕获方式,仅仅是一段代码[=]
函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this但不包括成员变量),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量),传值传递的变量相当于左值引用,不可修改,如果要修改要加上mutable告诉编译器这个值是永远可变的。
同时mutable只能用于类的成员变量[&]
函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是引用传递方式(相当于是编译器自动为我们按引用传递了所有局部变量)。[this]
函数体内可以使用 Lambda 所在类中的成员变量。[变量x]
将变量x按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的,要修改传递进来的拷贝,可以添加 mutable 修饰符。[&变量x]
将变量x按引用进行传递。[变量x,&变量x1]
将变量x按值传递,变量x1按引用进行传递。[=,&变量x,&变量x1]
除变量x和变量x1按引用进行传递外,其他参数都按值进行传递。[&,变量x,变量x1]
除变量x和变量x1按值进行传递外,其他参数都按引用进行传递。

参数:

参数,像普通函数那样定义你的参数就可以了。

函数体:

在函数体里可以随意编写代码。

值得一提的是,lambda不能访问超过所在区域的变量,如lambda在函数体里,那么它不能访问全局变量,换句话说,如果它在全局里,它可以访问全局变量,但不能访问别的函数体里的局部变量,其次是它不能引用静态变量,因为静态变量不属于局部变量。

其次是,lambda使用=传递时,会创建变量的副本(需要额外的栈空间),但是是const类型的,如果你修改它的值但是不会危险到原本变量里的值。

这是一段列子:

int main()
{int j = 0;auto df = [=]{return j;}();printf("%d\n",df);return 0;
}

输出结果为0,如果你的Lambda表达式里无需参数,那么在使用时,不要加上(),否则会报错。

同时如果没有参数的话,表达式里的参数()可以放到末尾

如果有参数的情况下不行:

int main()
{int j = 0;auto df = [=](int a){return j+a;};printf("%d\n",df(10));return 0;
}

输出为“10”

使用引用的情况下是可以修改值的:

int main()
{int j = 0;auto df = [&](int a){j = j+10;return j+a;};printf("%d\n",df(10));return 0;
}

输出20

但是引用传递的是副本,切记是副本!!不会改变其本身值:

int main()
{int j = 0;auto df = [&](int a){j = j+10;return j+a;};printf("%d\n",df(10));printf("%d\n",j);return 0;
}

输出:

20

10

当然你也可以使用函数指针来指向它,依然是合法的:

auto a_lambda_func = [](int x) { /* ... */ };
void (*func_ptr)(int) = a_lambda_func;
func_ptr(4); // calls the lambda

在类的内部使用"&"或者“=”方式捕获是可以捕获成员变量的

C/C++_Lambda表达式相关推荐

  1. jdk1.8新特性_Lambda表达式的引入

    jdk1.8新特性_Lambda表达式的引入 引入 需求: 获取工资大于20000的员工信息 public class Employee {private String name;private in ...

  2. java override格式_Lambda表达式告别@override

    引言 什么是Lambda呢?你肯定想到了数学符号中的那个"入"形状的符号吧?它可不是数学界的专利,在java中也有哦,本文针对Android开发中的Lambda表达式,详细介绍并且 ...

  3. as my sql 后面加表达式_Lambda 表达式有何用处?如何使用?

    C++11推出了新的lambda表达式,这是相当好用的东西. lambda表达式基本用法 /*返回一个数值*/ int main() { auto str = [] {return 54; }; // ...

  4. lambda表达式_Lambda表达式详解

    Lambda简介 Lambda 表达式是 JDK8 的一个新特性,可以取代大部分的匿名内部类,写出更优雅的 Java 代码,尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构. JDK 也提供了 ...

  5. 必须使用列别名命名此表达式_lambda表达式

    一般的,如果一个类定义了函数调用运算符,则我们可以像使用函数一样使用这个类,例如:一个类A定义了函数调用运算符,我们就可以使用A()这样的形式调用对象,实际上调用了类的调用运算符函数.如果一个类定义了 ...

  6. lambda ::表达式_Lambda表达式和流API:基本示例

    lambda ::表达式 这篇博客文章包含基本Lambda表达式和Stream API示例的列表,我在2014年6月在Java用户组Politechnica Gedanensis (格但斯克技术大学) ...

  7. java lambda表达式详解_Lambda表达式详解

    1 Lambda表达式是Java8中的新特性 Java8中引入Lambda表达式,使得java可以函数式编程,在并发性能上迈出了实质性的一步. 什么是函数式编程?函数式编程(英语:functional ...

  8. java8新特性_Java8新特性_lambda表达式

    lambda介绍 λ ,希腊字母表中排序第十一位的字母,英语名称为Lambda. lambda 表达式,也可称为闭包,它是推动==Java 8== 发布的最重要新特性,允许把函数作为一个方法的参数(函 ...

  9. java闭包和lambda关系_Lambda表达式和闭包Closure

    简介 我们通常讲到闭包,一般都是指在javascript的环境中.闭包是JS中一个非常重要的也非常常用的概念.闭包产生的原因就是变量的作用域范围不同.一般来说函数内部的定义的变量只有函数内部可见.如果 ...

  10. python内嵌函数和闭包与java 匿名内部类_Lambda表达式与匿名内部类的联系和区别...

    Java Lambda 表达式的一个重要用法是简化某些匿名内部类的写法,因此它可以部分取代匿名内部类的作用. Lambda 表达式与匿名内部类的相同点如下: Lambda 表达式与匿名内部类一样,都可 ...

最新文章

  1. 利用BeanUtils在对象间复制属性
  2. 每日一笑 | 对不起,我还没下班...
  3. mysql学时用什么类型_MYSQL数据库学习----MYSQL数据类型
  4. BBScan:信息泄漏批量扫描脚本
  5. LINQ能不能用系列(一)LINQ to Object 效率比对
  6. 利用swoole coroutine协程实现redis异步操作
  7. 使用Chrome inspect进行夜神模拟器里app的调试
  8. 顶顶通软电话介绍-一个网络电话客户端(SIP软电话)
  9. 字节面试算法题:用集合中的数凑小于target的最大数(Java实现,各类用例均通过)
  10. Windows 微博图床工具(支持多种图床)下载和picgo VSCode插件版的详细介绍
  11. ChatGPT/大模型+零代码,给中小企业带来哪些机会?
  12. IPA包重签企业证书
  13. 牛客算法周周练11 A.切题之路 签到题
  14. www.ty66.php,韬轩阁
  15. 学习UI设计,哪些软件是必学的
  16. 大连理工大学开发区校区新手指南——2.校园介绍篇
  17. 适合python的vim设置
  18. 自主移动机器人常用的导航定位技术及原理
  19. 3D、4D、5D区别?
  20. 数据结构与算法——前缀、中缀、后缀表达式

热门文章

  1. bvp解算器是什么_中科院孙晓明:算法本身并没有善恶,看你想要的目标是什么...
  2. vbs 窗体文字获取文档_MDI类型窗体设置背景图片
  3. 银行家算法课程设计(附源代码)
  4. 播放量子计算机的声音,首次实现:用声音纠缠了两个量子比特!
  5. java future 返回值_Java--Callable与返回值future
  6. 树莓派 ubuntu gpio_如何给树莓派安装操作系统
  7. 最长公共子串_两个字符串的最长公共子串(后缀自动机)
  8. bootstrap日期控件 只显示 年月
  9. mysql 截取最后三位查询
  10. python的zip_python中的zip()函数