• 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;

    }

     

     

  • 相关阅读:
    音乐播放器
    滚动视图、定时器、分页控件的综合使用
    简易拼图
    IOS开发复习笔记(1)-OC基础知识
    64位matlab mex64位编译器解决方案
    LibSvm添加到Matlab
    code first 数据库无损迁移
    asp.net mvc4连接mysql
    自定义控件引用时候尺寸发生变化
    jquery 操作动态添加的元素
  • 原文地址:https://www.cnblogs.com/bclshuai/p/8798034.html
Copyright © 2020-2023  润新知