C++11新特性(lambda表达式基础&&函数指针)

Lamda表达式(匿名函数)定义函数语法:

  • [可访问外部变量](参数)->返回值{函数体}
  • [变量名1,变量名2.....](){}        指定部分变量访问
  •  [=](){}                                       值传递形式捕获外部所有变量 (内部无法改变实际变量)   
  •  [&](){}                                       引用形式捕获外部所有变量     (内部可以改变实际变量)
  •  [this](){}  this只能捕获全局变量,类成员变量,不能捕获局部变量
  • 默认情况下,lambda表达式以const来修饰函数体
  • lambda表达式可以转换为函数指针,但是lambda表达式不可以捕获外部变量
  • 函数指针不可以转换为lambda表达式


lambda表达式基础代码示例:

#include <iostream>
using namespace std;

void lambda_test();

int global_a = 100;
class Test
{
public:
    int num1 = 1;
    void func()
    {   
        int num2 = 2;
        auto t1 = [=]()
        {
            cout << num1 << "\t" << num2 << "\t" << global_a << endl;
        };
        t1();
        //this只能捕获全局变量,类成员变量,不能捕获局部变量
        auto t2 = [this]()
        {
            //cout << num1 << "\t" << num2 << endl;不可捕获局部变量
            cout << num1 << "\t" << global_a << endl;
        };
        t2();
    }
};
int main()
{

    lambda_test();
    Test t;
    t.func();
    return 0;
}

void lambda_test()
{
    int data1 = 10;
    int data2 = 20;
    int a = 97;
    int b = 98;
//-----------1、data1,data2以值传递方式给lambda表达式
    auto t1 = [data1,data2]()
    {
        cout << data1 << "\t" << data2 << endl;
        //cout << a << "\t" << b << endl;错误,捕获列表[]中只有data1,data2
    };
    t1();
//-----------2、x,y做为lambda表达式参数的形式存在
    auto t2 = [](int x,int y)
    {
        cout << x << "\t" << y << endl;
    };
    t2(11,22);
//-----------3、=以值传递形式捕获外部所有变量 ,包含全局变量(内部无法改变实际变量)
    auto t3 = [=]()
    {
        //a = 65;错误,内部无法改变实际变量
        //b = 66;
        cout << data1 << "\t" << data2 << "\t" << a << "\t" << b << endl;
    };
    t3();
    auto t33 = [=]()mutable
    {
        a = 65;//正确,添加mutable修饰符可以改变实际变量
        b = 66;
        cout << data1 << "\t" << data2 << "\t" << a << "\t" << b <<"\t" << global_a << endl;
    };
    t33();
//-----------4、&以引用形式捕获外部所有变量 ,包含全局变量(内部可以改变实际变量)
    auto t4 = [&]()
    {
        a = 65;//正确,内部可以改变实际变量
        b = 66;
        cout << data1 << "\t" << data2 << "\t" << a << "\t" << b << "\t" << global_a<< endl;
    };
    t4();

}

 lambda表达式与函数指针代码示例:

#include <iostream>
using namespace std;

void lambda_test();

int global_a = 100;

int main()
{

    lambda_test();

    return 0;
}

void lambda_test()
{
    int (*func)(int x,int y);//函数指针
//-----------lambda表达式
    auto  t1 = [](int data1,int data2)
    {
        return data1 + data2;
    };
    func = t1;//lambda表达式可以转换为函数指针,但是lambda表达式不可以捕获外部变量
    //t1 = func;函数指针不可以转换为lambda表达式
    cout << (*func)(10,20) << endl;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牵猫散步的鱼儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值