lambda表达式

lambda表达式

定义了一个匿名函数,可以捕获一定范围的变量在函数内部使用

1.函数指针:

#include <iostream>
using namespace std;
//函数指针
void fun(){
    cout<<"nihao"<<endl;
}
​
int fun0(int a)
{
    cout<<a<<endl;
    return 1;
}
​
int main()
{
    //c++中的函数指针
    void (*p) ();
    //指针p指向一个函数,指针p的类型是函数返回值的类型,()里面代表的是函数参数的类型
    p=fun;
    p();
​
    int (*q) (int);
    q=fun0;
    q(1);
    return 0;
}

2.lambda表达式语法:

auto fun=[传的值](参数)->强制返回值类型{函数体};
int main()
{
    //[](){};
    //lambda表达式,匿名函数,即不需要函数的名字
    //[]是lambda表达式的标志,
    //()小括号里面是lambda表达式的参数列表,大括号里面是函数体
    //{}里面是函数体
​
    [](int a,int b){
        cout<<"这是lambda表达式!,a,b的值为:"<<a<<" "<<b<<endl;
    }(111,222);//这里的()里面就是给参数赋值
​
    return 0;
}
lambda表达式也是一个对象,可以赋值。

	//对lambda表达式进行赋值,变量fun就成为为一个函数。
    auto fun=[](int a){
        cout<<"这是lambda表达式!,a的值为:"<<a<<endl;
    };
    fun(111);//调用这个函数。
lambda表达式指定返回值类型

//强制指定返回值的类型
    auto fun2=[](int a)->double{
        cout<<"a的值为:"<<2<<endl;
        return a;
    };
    fun2(2);
    cout<<typeid(fun2(2)).name()<<endl;

3.传值

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int x=1;
    int y=2;

    //要在lambda表达式里面输出x,y的值;

    // 1.参数传入,这种情况下在lambda表达式函数体内部对x,y的值进行修改不会改变外面的x,y;
    auto fun1=[](int x,int y){
        x+=1;

        cout<<x<<" "<<y<<endl;
    };
    fun1(x,y);

    [](int x,int y){
        cout<<x<<" "<<y<<endl;
    }(x,y);

cout<<"--------"<<endl;

    // 2.[]传入,在lambda表达式函数体内部不能对x,y进行修改
    [x,y](){
        cout<<x<<" "<<y<<endl;
    }();

    auto fun2=[x,y](){
        cout<<x<<" "<<y<<endl;
    };
    fun2();
    cout<<x<<endl;

    cout<<"--------"<<endl;


    //3.[]里面使用引用传入,可以改变x,y的值。
    auto fun3=[&x,&y](){
        cout<<x<<" "<<y<<endl;
        x+=1;y+=2;
    };
    fun3();
    cout<<x<<" "<<y<<endl;

    cout<<"--------"<<endl;


    //4.[]传数规则
    // [=]  值传递,表示在lambda表达式函数体外的变量,都可以访问
    // [&]  引用传递 表示在lambda表达式函数体外的变量,可以访问和修改
    // [=,&y]  表示,在lambda表达式函数体外的变量除了y可以进行修改,其他的变量只能进行访问,不能进行修改
    // [&,y]  表示,在lambda表达式函数体外的变量除了y不能修改,其他的都能进行修改
    //


    //5.[]传入一个值,要求只在函数体里面进行修改,在函数体外部不变,使用mutable
    int z=3;

    //不加mutable会报错
    // auto fun5=[z]() {
    //         cout<<z<<endl;
    //         z+=3;
    //     };
    // fun5();
    
    auto fun5=[z]()mutable {
        cout<<z<<" ";
        z+=3;
        cout<<z<<endl;
    };
    fun5();
    cout<<z<<endl;

    return 0;
}

运行结果:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值