C++ Lambda表达式

Lambda表达式

C++11 中Lambda表达式用于定义和创建匿名函数

语法:[] () {};

[函数参数] (形参列表) mutable -> 返回值类型 {函数体};
  1. []标识符,告诉编译器此处是匿名函数,也用于捕获表达式以外的变量。即中括号内的变量是来自于lambda函数作用域之外
    • 中括号内为空,不使用外部变量
    • [=],外部变量以值传递的方式传给函数内部
    • [&],外部变量以引用传递的方式传给函数内部
  2. ()参数,lambda表达式函数体的形参就放在这里。
  3. {} 函数实现体
  4. 修饰或声明,可省略
    • mutable,加mutable修饰符后可以修改传递进来的拷贝
    • exception 声明用于指定函数抛出的异常
  5. -> 数据类型,函数返回的数据类型,无返回值可省略
  6. {} 函数体
  7. 花括号后再跟(),表示直接调用该匿名函数
connect(btn,&QPushButton::clicked,[=](){
    btn->setText("aaaaa");
    emit hdh->class_over();
    this->close();
});

简单使用

无返回值:

#include<iostream>
#include<string>
using namespace std;

int main() {
    // 定义一个lambda表达式并立即调用
    [](int x){
        cout << x << endl;
    }(9);
    
    // 将一个lambda表达式赋值给auto对象,以便于重复调用
    auto printX = [](string str){
        cout << str << endl;
    }
    // 通过对象调用函数
    printX(90);
    
    system("pause");
    return 0;
}

有返回值,加箭头、关键字:

int main() {
    // 直接定义表达式并调用
    int ret = [](int a, int b) ->int {
        int c = a + b;
        return c;
    }(2,3);
    cout << ret << endl;
    
    // 使用auto对象接收再调用
    auto myAdd = [](int a, int b){
        int c = a + b;
        return c;
    };
    cout << myAdd(2,3) << endl;
}

捕获表达式外部参数并在函数内部修改值:

int main() {
    int a = 10, b = 15;
    /*
    lambda表达式中括号内传递=表示捕获表达式外所有变量,并以值传递的方式传给函数体
    同时,函数体内不能修改传递进来的值的拷贝,因为默认情况下函数参数是有const修饰的
    想要修改其拷贝,可以使用关键字mutable
    */ 
    auto func = [=]() mutable ->int {
        ++a;
        int c = a + b;
        return c;
    };
    
    cout << func() << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ Lambda表达式是一种简洁的匿名表示方法,可以在代码中定义并使用。Lambda表达式的格式一般为:[] (参数列表) mutable -> 返回值类型 { 表达式 }。Lambda表达式可以捕获外部变量,并将其作为参数传递给函数体部分进行处理。Lambda表达式在使用时可以作为函数对象、函数指针或者函数参数进行传递。 Lambda表达式的底层原理是通过生成一个匿名类来实现。该类会重载函数调用运算符(),并包含Lambda表达式的函数体。Lambda表达式中捕获的外部变量会以成员变量的形式存储在该类中。当Lambda表达式被调用时,实际上是调用了该类的重载函数调用运算符()。 Lambda表达式可以与std::function结合使用,以实现函数对象的灵活使用。也可以将Lambda表达式赋值给相同类型的函数指针,实现函数指针的使用。但一般不建议这样使用,因为Lambda表达式已经提供了更加方便和简洁的方式。 总结来说,C++ Lambda表达式是一种用于定义匿名函数的语法,可以捕获外部变量并进行处理。其底层通过生成一个匿名类来实现,并提供了与std::function和函数指针的结合使用方式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++11:lambda表达式](https://blog.csdn.net/zhang_si_hang/article/details/127117260)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值