lambda匿名函数透析
lambda匿名函数透析
目录
1 匿名函数的作用... 1
2 匿名函数的格式... 1
3 匿名函数实例代码... 3
1 匿名函数的作用
使用一个新东西之前,先要弄清楚这东西有什么好处,有什么作用,要不要用。匿名函数的作用是提供一种一般只在某处使用一次,而且代码长度比较短的情况,比如在一个函数中要将时间转换为字符串格式。如果你要在类中定义这个函数,则要命名一个函数,再实现函数,这个函数其他地方又用不到,而且很短小,而外的增加了一个接口函数,感觉大材小用;这样我们只要在用的地方实现一个匿名函数,这个匿名函数实现了简单的功能,而且可以使用作用域内的所有变量,如果是在类中定义一个函数,需要将用到的变量当做参数传递进去,而匿名函数不用采用参数传入的形式,可以直接使用作用域内的变量,减少形参和实参的传递,这应该是匿名函数简洁的特性体现。
2 匿名函数的格式
如图所示匿名函数的格式如图所示,[ 捕获列表 ] ( 形参数列表 ) mutable(可选) 异常属性 -> 返回值类型 { 函数体 }

(1)匿名函数以[]开头,来声明一个匿名函数,[]中可以是等号=,表示作用域内的所有变量按值传递给匿名函数,匿名函数内对变量进行操作,不会改变作用域内变量的值,只是传入变量的值进去。如果是&,则表示作用域内的所有变量按引用传入匿名函数,匿名函数内部对变量的修改,会使作用域内的变量的值发生变化。如果懂得编程的人就知道,这其实是按值传递参数和按引用传递参数的区别。如果需要指定特定的变量传入匿名函数,在[]内用变量名(按值传递)或者&加变量名称(按引用传递)的方式逐个添加。举几个实例就知道了。
1)[&]外部作用域中所有变量,按引用传递到匿名函数
2)[=]外部作用域中所有变量,按值传递到匿名函数
3)[=, &foo] foo变量按引用传递,其他的变量按值传递
4)[x, &y] x按值传递,y按引用传递
5)[this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
这魔法般的变量捕获是怎么实现的呢?原来,lambda是通过创建个小类来实现的。这个类重载了操作符(),一个lambda函数是该类的一个实例。当该类被构造时,周围的变量就传递给构造函数并以成员变量保存起来。看起来跟函数对象很相似。
(2)匿名函数的形参列表,和普通函数的形参列表一样,在你调用的时候需要传入一些自定义的参数,可以添加到括号中;如果没有形参,也可以省略形参列表和括号;
(3)mutable的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。默认情况下, Lambda函数总是一个const函数, 一个const的成员函数是不能在函数体内修改非静态成员变量的值,而mutable可以取消其常量性,能够修改按引用传递的变量。 而且在使用该修饰符时, 参数列表不可省略(即使参数为空)。
(4)异常标识;抛出异常;
(5)返回值类型,匿名函数的返回值,如果为void,可以连同符号”->”一起省略. 如果返回类型明确,比如返回一个int型变量, 也可以省略该部分, 让编译器对返回类型自行推导。
(6)函数体,内容与普通函数一样, 不过除了可以使用参数之外, 还可以使用传入的作用域内的变量;
3 匿名函数实例代码
(1)比如我要实现一个简单的加减乘除的计算器;
// AnonymityFunction.cpp : Defines the entry point for the console application.
//
#include"stdafx.h"
#include <iostream>
using namespace std;
typedef enum//定义枚举类型
{
add = 0,
sub,
mul,
divi
}op;
int main(int argc, char* argv[])
{
int a = 1, b = 2;//定义变量
//定义匿名函数,实现不同的运算符自动计算数值。
auto func = [=](op i) -> int
{
switch (i)
{
case add:
return a + b;
case sub:
return a - b;
case mul:
return a * b;
case divi:
return a / b;
}
};
cout << func(add) << endl;//3
system("pause");
}
(2)实现两个变量的交换
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a = 1, b = 2;//定义变量
auto change = [&]() mutable {int c = a; a = b; b = c; };
change();//a变为2,b变为1;
cout << "a=" << a<<"b="<<b;
system("pause");
return 0;
}
lambda匿名函数透析的更多相关文章
- lambda 匿名函数
# 普通python函数 def func(a,b,c): return a+b+c print func(1,2,3) # 返回值为6 # lambda匿名函数 f = lambda a,b,c:a ...
- lambda 形参:返回值 lambda 匿名函数 格式:
lambda 匿名函数 格式: lambda 形参:返回值 e.g f = lambda n:n**2 print(f(10))
- Python 进阶 之 lambda 匿名函数
lambda 是个匿名函数,通常用于简单判断或者处理,例如判断一个数的奇偶性,过滤字符串,逻辑运算等等. lambda表达式: >>>lambda x:x*x >>> ...
- xpinyin-函数返回多个值-lambda匿名函数-列表生成式-三元表达式
import xpinyinp=xpinyin.Pinyin() #实例化print(p.get_pinyin('小白','')) 函数返回多个值:1.函数如果返回多个值的话,它会把这几个值放到一个元 ...
- lambda匿名函数和他的小伙伴(处理大量数据的时候用到)
lambda匿名函数 主要是为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n f = lambda n : n ** n 语法: 函数名 = ...
- lambda匿名函数,sorted(),filter(),map(),递归函数
1.lambda匿名函数 为了解决一些简单的需求而设计的一句话函数 #计算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n* ...
- python基础-4 函数参数引用、lambda 匿名函数、内置函数、处理文件
上节课总结 1.三元运算 name=“name1”if 条件 else “name2” 2.深浅拷贝 数字.字符串 深浅,都一样 2.其他 浅拷贝:只拷贝第一层 深拷贝:不拷贝最后一层 3.set集合 ...
- Python 之父为什么嫌弃 lambda 匿名函数?
Python 支持 lambda 匿名函数,其扩展的 BNF 表示法是lambda_expr ::= "lambda" [parameter_list] ":" ...
- Java中的lambda匿名函数使用
Java中的lambda匿名函数使用 lambda匿名函数的使用是为了满足某些情况下需要临时定义函数,或者事先定义,需要时才使用.在python里面,lambda表达式的表达方式为:lambda 参数 ...
随机推荐
- 原生js+canvas实现滑动拼图验证码
上图为网易云盾的滑动拼图验证码,其应该有一个专门的图片库,裁剪的位置是固定的.我的想法是,随机生成图片,随机生成位置,再用canvas裁剪出滑块和背景图.下面介绍具体步骤. 首先随便找一张图片渲染到c ...
- leetCode:237 删除链表的结点
删除链表的结点 编写一个函数,在给定单链表一个结点(非尾结点)的情况下,删除该结点. 假设该链表为1 -> 2 -> 3 -> 4 并且给定你链表中第三个值为3的节点,在调用你的函数 ...
- 笔记:Spring Cloud Ribbon RestTemplate 详解
详细介绍RestTemplate 针对几种不同请求类型和参数类型的服务调用实现,示例代码中的 restTemplate 都是通过Spring 注入方式创建的,相关代码如下: @Autowired pr ...
- Ajax与服务器(JSON)通信介绍
本文主要介绍使用Ajax与服务器(JSON)通信方法,谈谈Ajax提供的两类服务器通信手段:同步通信和异步通信.有需要的可以了解一下.毕竟这个时代出了很多东西,自动化构建工具,mvvm框架等等.Jav ...
- DotNetBar控件,superTabControl多文档界面(MDI)的风格、多Tab的创建方法
最近在做一个条码系统的项目,第一次用dotnetbar控件,,查找资料时看到伍老师一篇文章(链接),但是没有关于加载tab窗口的方法,自己摸索做了一个此类风格出来,并写了一个通用方法,供大家参考. 风 ...
- 基于Multiple treatment的营销评估算法
营销是发现或挖掘准消费者和众多商家需求,通过对自身商品和服务的优化和定制,进而推广.传播和销售产品,实现最大化利益的过程.例如,银行可通过免息卡或降价对处在分期意愿边缘的用户进行营销,促使其分期进而提 ...
- React Native 轻松集成统计功能(Android 篇)
关于推送的集成请参考这篇文章,本篇文章将引导你集成统计功能,只需要简单的三个步骤就可以集成统计功能. 第一步 安装 在你的项目路径下执行命令: npm install janalytics-react ...
- C语言第二次博客作业---分支结构 陈张鑫
一.PTA实验作业 题目1:计算分段函数[2] 本题目要求计算下列分段函数f(x)的值: 1.实验代码 int main(){double x,y; scanf("%lf",&am ...
- 敏捷冲刺每日报告——Day2
1.情况简述 Alpha阶段第一次Scrum Meeting 敏捷开发起止时间 2017.10.26 00:00 -- 2017.10.27 00:00 讨论时间地点 2017.10.26晚9:30, ...
- EasyUI中, datagrid用loadData方法绑定数据。
$("#dg").datagrid("loadData", { , " }, { "ck": "1", &qu ...