C++Lambda表达式详解

 更新时间:2021年10月14日 16:10:21   作者:Yaronzz  
这篇文章主要介绍了C++中的Lambda表达式详解,本文讲解了基本语法、Lambda的使用等内容,需要的朋友可以参考下,希望能够给你带来帮助

概述

C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:

[捕获列表] (参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
//计算两个值的和
auto func = [](int a, int b) -> int{return a+b;};
//当返回值的类型是确定时,可以忽略返回值
auto func = [](int a, int b){return a + b;};
//调用
int sum = func(1, 3);

语法分析

捕获列表

Lambda 表达式相当于一个类,那么捕获列表就是传递给这个类的类成员。比如:

class Labmda
{
public:
    const int test;
    Labmda(int value):test(value)
    {
    }
public:
    int run(int a, int b)
    {
        return a + b + test;
    }
}
int main()
{
    int test = 10;
    auto func = Labmda(test);
    int sum = func.run(1, 3);
}
//使用Lambda 表达式的写法
int main()
{
    int test = 10;
    auto func = [test](int a, int b){return a + b + test;};
    int sum = func(1, 3);
}

捕获列表有以下格式:

格式 描述
[] 不带任何参数
[=] Lambda表达式之前的局部变量,包括所在类的this,变量按值方式传递
[&] Lambda表达式之前的局部变量,包括所在类的this,变量按引用方式传递
[this] Lambda表达式所在类的this
[a] Lambda表达式之前的局部变量a的值,也可以传入多个值,如[a , b]
[&a] Lambda表达式之前的局部变量a的引用

关键字声明

关键字声明一般都很少用到,也不建议随便使用,可以忽略不计。

mutable

当捕获列表以值的方式传递时有效,加上此关键字后,可以修改Lambda类成员(带const修饰符)。比如:

int test = 10;
//编译报错,test成员不能修改
auto func = [test](int a, int b){test = 8; return a + b + test;}; 
//编译正常
auto func = [test](int a, int b)mutable {test = 8; return a + b + test;}; 

这里需要注意的是:Lambda类成员test修改之后,并不会改变外部int test的值。

exception

exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)

示例

捕获列表按值传递

int test = 10;
auto func = [=](int a, int b){return a + b + test;};
auto func2 = [test](int a, int b){return a + b + test;};
int sum = func(1, 3); //sum等于14

这里需要注意的是func表达式中test的值只更新到表达式之前:

int test = 10;
auto func = [=](int a, int b){return a + b + test;};
test = 5;
int sum = func(1, 3); //sum还是等于14

捕获列表按引用传递

int test = 10;
auto func = [&](int a, int b){test = 5; return a + b + test;};
auto func2 = [&test](int a, int b){test = 5; return a + b + test;};
int sum = func(1, 3); //sum等于9,test等于5

这里func表达式中test的值就能随时更新:

int test = 10;
auto func = [&](int a, int b){return a + b + test;};
test = 5;
int sum = func(1, 3); //sum等于9,test等于5

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 如何写好C main函数的几个注意事项

    如何写好C main函数的几个注意事项

    这篇文章主要介绍了如何写好C main函数的几个注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列)

    这篇文章主要介绍了stl常用算法(Algorithms)介绍(stl排序算法、非变序型队列),需要的朋友可以参考下
    2014-05-05
  • C语言手写集合List的示例代码

    C语言手写集合List的示例代码

    数组长度是固定的,那么在很多时候我们并不知道到底有多少数据需要存储,这时候我么就需要一个可变长度的数组来进行存储,在C语言中需要我们自己进行定义,我们称为集合。本文将用C语言实现手写集合,需要的可以参考一下
    2022-08-08
  • 详解C++实现拓扑排序算法

    详解C++实现拓扑排序算法

    拓扑排序是对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。本文将对其原理进行讲解,并且用C++进行实现
    2021-06-06
  • C++实现简单的计算器功能

    C++实现简单的计算器功能

    这篇文章主要为大家详细介绍了C++实现简单的计算器功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01
  • 在动态库和静态库中使用模板(dynamic libraries ,static libraries)

    在动态库和静态库中使用模板(dynamic libraries ,static libraries)

    给大家介绍一下在动态库(dynamic libraries)和静态库(static libraries)使用模板(template)的用法和解决方案。
    2017-11-11
  • C++中using的三种用法举例详解

    C++中using的三种用法举例详解

    最近在使用中,发现了一种以前没学过的using用法,于是在这里,将using的几种用法总结一下,下面这篇文章主要给大家介绍了关于C++中using的三种用法,需要的朋友可以参考下
    2023-02-02
  • C语言实现图的搜索算法示例

    C语言实现图的搜索算法示例

    这篇文章主要介绍了C语言实现图的搜索算法,结合具体实例形式分析了C语言实现图的定义及搜索相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • C语言嵌入informix基础入门示例讲解

    C语言嵌入informix基础入门示例讲解

    这篇文章主要介绍了C语言嵌入informix基础方法,大家参考使用
    2013-11-11
  • 深入C++可见性与生命期的区别详解

    深入C++可见性与生命期的区别详解

    本篇文章对C++中可见性与生命期的区别进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论