C++11新特性(3) lambda表达式(1)

C++11添加了一项名为lambda表达式的新功能.通过这项功能能编写内嵌的匿名函数,而不必编写独立函数或函数对象,使得代码更加理解.

lambda表达式包含以下部分.

[capture_block](parameters) mutable exception_specification->return_type {body}

现在分析各个部分的内容:

(capture_block)捕捉块:指定如何捕捉所在作用域的变量,并供给lambda主体部分使用.

(parameter)参数(可选):lambda表达式使用的参数列表.只有在不需要任何参数并且没有指定mutable,一个exception_specification和一个return_type的情况下可以忽略该列表.任何类型在某些情形下也是可以忽略的.例如:[]{return 10;};

mutable:(可选):如果所在作用域的变量是通过值捕捉的,那么lambda表达式的主体中就不能修改这些副本的值.这些副本默认标记为const,因此lambda表达式主体不能修改这些副本的值.如果lambda表达式标记为mutable,那么这些副本则不是const,因此主体可以修改这些本地副本.(类似于参数传递中的值传递以及引用传递修改源值)

exception_specification:(可选)用于指定lambda表达式可以抛出的异常.

Return_type(可选)返回值的类型:如果忽略了return_type,那么编译器会根据以下原则判断返回类型:

1)如果lambda表达式主体的形式为{return exception;},那么lambda表达式的return_type为exception的类型;

2)其他情况下的return_type为void.

下面看一些例子:

//test2.cpp

#include <iostream>

using namespace std;

int main(){

[]{cout<<"hello lambda!"<<endl;}();

}

看编译以及运行的结果

来剖析一下这个lambda表达式的各部分

[]{cout<<"hello lambda!"<<endl;}();

[]:这是捕捉块,参数为空;

{cout<<"hello lambda!"<<endl;}:这是body

():这是为了让该lambda表达式立即执行.

因为实际上[]{cout<<"hello lambda!"<<endl;}就是lambda表达式的所有组成部分,其功能类似于一个匿名的函数,要让其立即执行,必须调用该函数,而该函数是匿名的,该如何调用呢?

其实[]{cout<<"hello lambda!"<<endl;}就相当于函数的名称了,因为其参数为空,因此只需要传递一个空参即可调用,要验证也是很容易的,例如

#include <iostream>

using namespace std;

int main(){

[](int n){cout<<"hello lambda!+"<<n<<endl;}(10086);

}

可以很容易看出其中的规律!

再看一个复杂一点的拥有返回值的lambda表达式.

#include <iostream>

#include <string>

using namespace std;

int main()

{

string result=[](const string &str)->string{return "this is "+str;}("lambda!");

cout<<result<<endl;

}

string result=[](const string &str)->string{return "this is "+str;}("lambda!");

这个例子里面指明了这个lambda返回值为string!

当然,这个返回值也是可以忽略的,返回值就是"this is "+str的类型,很明显,这是一个string类型.

还可以保存指向lambda表达式的指针,这样就可以很方便的调用该lambda表达式,使用C++11中的auto关键字进行声明.例如:

#include <iostream>

#include <string>

using namespace std;

int main()

{

auto func=[](const string &str){return "this is "+str;};

cout<<func(" one!")<<endl;

cout<<func(" two!")<<endl;

}

这样,就可以对lambda表达式进行代码重用了!

对lambda的基本介绍就到这里了,更深入的内容请看下一章.

C++11新特性(3) lambda表达式(1)

时间: 2024-11-05 06:08:42

C++11新特性(3) lambda表达式(1)的相关文章

C++11 新特性之 Lambda表达式

lambda表达式可以用于创建并定义匿名的函数对象,以简化编程工作 Lambda的语法如下: [函数对象参数](操作符重载函数参数)->返回值类型{函数体} []内的参数指的是Lambda表达式可以取得的变量.(2)函数中的param就是指函数可以得到在Lambda表达式外的全局变量, 如果在[]中传入=的话,即是可以取得所有的外部变量,如(1)和(3)Lambda表达式 ()内的参数是每次调用函数时传入的参数. ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变

c++11 新特性之lambda表达式

写过c#之后,觉得c#里的lambda表达式和delegate配合使用,这样的机制用起来非常爽.c++11也有了lambda表达式,形式上有细小的差异.形式如下: c#:(input parameters) => {statement;} c++:[capture list](parameter list) -> return type {statement;} c++lambda表达式共分为4各部分.其中parameter list 和 return type 是可以在特定情况下省略的. 一

C++11新特性:Lambda函数(匿名函数)

声明:本文参考了Alex Allain的文章http://www.cprogramming.com/c++11/c++11-lambda-closures.html 加入了自己的理解,不是简单的翻译 C++11终于知道要在语言中加入匿名函数了.匿名函数在很多时候可以为编码提供便利,这在下文会提到.很多语言中的匿名函数,如C++,都是用Lambda表达式实现的.Lambda表达式又称为lambda函数.我在下文中称之为Lambda函数. 为了明白Lambda函数的用处,请务必先搞明白C++中的自动

c++11新特性(4) lambda捕捉块

lambda表达式中的方括号成为捕捉块,可以在这里指定如何从所在的作用域中捕捉变量. 捕捉的意思是指可以在该lambda中使用该变量.即可以捕获外部变量在lambda表达式内使用. 可以使用两种方式来捕捉所在的作用域中的所有变量. [=]:通过值捕捉所有变量 [&]:通过引用捕捉所有变量 指定空白的捕捉块[]表示不从所在作用域中捕捉变量. 还可以指定捕捉哪些变量以及这些变量的捕捉方法. [&x],只通过引用捕捉x,不捕捉其他变量. [x] 只通过值捕捉x,不捕捉其他变量. [=,&

JDK1.8新特性(二): Lambda表达式 (参数列表) -&gt; { } 和函数式接口@FunctionalInterface

Lambda表达式 二:简介 JDK的升级的目的有以下几个:增加新的功能.修复bug.性能优化.简化代码等几个方面,Lambda表达式就是属于简化代码,用于简化匿名实现类,提供一种更加简洁的写法.Lambda表达式在Swift语言中称之为代码块,Lambda表达式可以认为是一种特殊的接口,该接口必须只有一个抽象方法. 语法 (参数类型 参数名, 数参数类型 参数名2...) -> { // code }; 小括号()中的内容就是方法中的参数列表包括参数类型.参数名,其中参数类型是可以省略的,当参

jdk1.8新特性之lambda表达式

lambda表达式其实就是指一个匿名函数,应用最广泛的就是匿名内部类.在jdk1.8之前,我们定义一个匿名内部类可能需要写一大坨代码,现在有了lambda之后,可以写的很简洁了.但不是说lambda只能用来简化匿名内部类,从lambda的实际作用和表现上来看,就是一个变量指代一个代码块.而能够使用lambda表达式的一个前提要求是,该变量必须实现某个函数式接口.啥是函数式接口?参考jdk1.8新特性之函数式接口.看例子: 1.函数式接口 * Copyright (c) 1994, 2013, O

好程序员分享java8新特性之Lambda表达式

?.Lambda表达式简介 什么是Lambda? Lambda表达式是Java 8推出的?个新特性.从本质上讲,Lambda表达式是?个匿名函数. 为什么要使?Lambda? 使?Lambda表达式可以对?个接?进??常简洁的实现. 之前我们在给?个接?引?赋值的时候,可以使?接?实现类,或者匿名内部类.但是有了 Lambda表达式,我们可以更加?便的实现这个需求. interface Comparator<T>?{ int compare(T o1, T o2); } class Progr

2020了你还不会Java8新特性?Lambda表达式及API(二)

lambda表达式 为什么要使用lambda表示式 在Java中无法将函数座位参数传递给一个方法,也无法返回一个函数的方法. 在js中,函数的参数是一个函数.返回值是另一个函数的情况是非常常见的.是一门经典的函数式语言. Java匿名内部类. 匿名内部类的介绍 Gradle的使用.可以完全使用maven的中央仓库. 进行安卓的开发时,gradle已经成为标配了. lambda: 匿名内部类 my_jButton.addActionListener(new ActionListener() { @

jdk1.8新特性之lambda表达式及在Android Studio中的使用举例

Jdk1.8已经出很久了但是很多同学对它的特性在android studio 中的应用可能还不是很熟悉,今天我们就来对这个新特性在AS中做它的应用实践. 一.首先在有JDK1.8的情况下我们要在AS的设置中将这个地方设置成java1.8的. 二在build.gradle中添加上这两句 即: compileOptions {    sourceCompatibility 1.8    targetCompatibility 1.8} 这样就完成了使用之前的设置工作了.然后我们进入重要的应用. 那么