lambda匿名函数透析

lambda匿名函数透析ios

目录编程

1       匿名函数的做用... 1app

2       匿名函数的格式... 1函数

3       匿名函数实例代码... 3this

 

1         匿名函数的做用

使用一个新东西以前,先要弄清楚这东西有什么好处,有什么做用,要不要用。匿名函数的做用是提供一种通常只在某处使用一次,并且代码长度比较短的状况,好比在一个函数中要将时间转换为字符串格式。若是你要在类中定义这个函数,则要命名一个函数,再实现函数,这个函数其余地方又用不到,并且很短小,而外的增长了一个接口函数,感受大材小用;这样咱们只要在用的地方实现一个匿名函数,这个匿名函数实现了简单的功能,并且可使用做用域内的全部变量,若是是在类中定义一个函数,须要将用到的变量当作参数传递进去,而匿名函数不用采用参数传入的形式,能够直接使用做用域内的变量,减小形参和实参的传递,这应该是匿名函数简洁的特性体现。spa

2         匿名函数的格式

如图所示匿名函数的格式如图所示,[ 捕获列表 ] ( 形参数列表 ) mutable(可选) 异常属性 -> 返回值类型 { 函数体 }指针

                       

(1)匿名函数以[]开头,来声明一个匿名函数,[]中能够是等号=,表示做用域内的全部变量按值传递给匿名函数,匿名函数内对变量进行操做,不会改变做用域内变量的值,只是传入变量的值进去。若是是&,则表示做用域内的全部变量按引用传入匿名函数,匿名函数内部对变量的修改,会使做用域内的变量的值发生变化。若是懂得编程的人就知道,这实际上是按值传递参数和按引用传递参数的区别。若是须要指定特定的变量传入匿名函数,在[]内用变量名(按值传递)或者&加变量名称(按引用传递)的方式逐个添加。举几个实例就知道了。对象

1)[&]外部做用域中全部变量,按引用传递到匿名函数blog

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;

}

相关文章
相关标签/搜索