zoukankan      html  css  js  c++  java
  • C++11常用特性介绍——Lambda表达式

    一、C++11采用配对的方括号[]来创建一个匿名函数并执行,如:

      #include <iostream>

      int main()

      {

        auto func = []{

          std::cout << "hello world!!!" << std::endl;

        };

        func();

      }

      捕获选项:

      1)[]:不捕获任何变量(没有使用任何函数对象参数)。

      2)[=]:拷贝捕获(函数体内可以使用Lambda所在作用范围内所有可见局部变量,包括Lambda所在类的this,并且是值传递方式,函数体内不可以修改局变量)。

      3)[&]:引用捕获(函数体内可以使用Lambda所在作用范围内所有可见局部变量,包括Lambda所在类的this,并且是引用传递方式,函数体内可以修改局变量)。

      4)[this]:捕获this指针(函数体内可以使用Lambda所在类中的成员变量)。

      5)[a]:指定拷贝(将变量a按值进行传递,函数体内不能修改传递进来的a拷贝,因为默认情况下函数是const的,修改传递进来的a拷贝,可以添加mutable修饰符)。

      6)[&a]:指定引用(将a按引用进行传递,函数体内可以修改传递进来的a拷贝)。

      7)[a,&b]:混合引用(将a按拷贝传递,b按引用传递)。

      8)[=,&a]:混合引用(将其它可见局部变量按拷贝传递,b按引用传递)。

      9)[a,&]:混合引用(将a按拷贝传递,其它可见局部变量按拷贝传递)。

      实例:

      1、不捕获任何变量

      #include <iostream>

      int main()

      {

        auto func = []{std::cout << "Hello World!!! << std::endl;}  //输出:Hello World!!!

        func();

      }

      2、拷贝捕获

      include <iostream>

      int main()

      {

        int i = 1024;

        auto func = [=]{std::cout << i << std::endl;}    //输出1024

        func();

      }

      3、引用捕获

      include <iostream>

      int main()

      {

        int i = 1024;

        auto func = [&]{std::cout << ++i << std::endl;}  //输出1025

        func();

      }

      4、捕获this指针

      #include <iostream>

      class Student

      {

      public:

        Student(int age = 0) : _age(age){}

        Show_Age()

        {

          auto func = [this]{

          std::cout << this->_age << std::endl;

          };

          func();

        }

    private:

      int _age;

      }

      int main()

      {

        Student student(1024);

        student.Show_Age();    //输出1024

      }

      5、指定拷贝

      include <iostream>

      int main()

      {

        int i = 1024;

        auto func = [i]{std::cout << i << std::endl;}    //输出1024

        func();

      }

      6、指定引用

      #include <iostream>

      int main()

      {

        int i = 1024;

        auto func = [&i]{std::cout << ++i << std::endl;}  //输出1025

        func();

        std::cout << i << std::endl;           //输出1024

      }

  • 相关阅读:
    HttpServletRequest和ServletRequest的区别.RP
    HttpServletResponse和HttpServletRequest详解.RP
    图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
    简单VBS教程.RP
    关于堆排序、归并排序、快速排序的比较
    函数的返回值是如何带出和接收的以及内存中的活动情况.RP
    SDUT 3402 数据结构实验之排序五:归并求逆序数
    常用工具
    图--生成树和最小生成树.RP
    python 带BOM头utf-8的响应解码
  • 原文地址:https://www.cnblogs.com/zhangnianyong/p/11973659.html
Copyright © 2011-2022 走看看