Qt-Lambda表达式_03

Lambda表达式

      C++11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作

Lambda表达式基本构成:

[capture](parameters)mutable->return-type
{
    statement
}

[函数对象参数](操作符重载函数参数)mutable->返回值(函数体)

{函数实现体}

      例如:

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
     QPushButton* btn = new QPushButton("下课", this);

    [=]{
        btn->setText("上课");
    }();
}

1. 函数对象参数

[],标识一个Lambda的开始,这部分必须存在。函数对象参数时传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用到哪些定义到Lambda前,Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:

  • 空。没有使用任何函数对象参数;
  • =。函数体内可以使用Lambda所在作用范围内所有可见的局部变量,是值传递的方式。
  • &。函数体内可以使用Lambda所在作用范围内所有可见的局部变量,是以引用传递方式。

通常建议使用=。

    原因:

// 执行此段代码
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
     QPushButton* btn = new QPushButton("下课", this);
     connect(btn, &QPushButton::clicked, this, [=](){
        btn->setText("上课");
     });
}

   点击"下课"按钮后:

     而将 '=' 改为 '&',点击"下课"按钮后:

     这是因为:做信号槽连接,默认内部变量会进行锁状态,只读状态,如果进行写操作,就会挂掉。

 

  • this。函数体内可以使用Lambda所在类中的成员变量,以值传递方式。
  • a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。

       如下所示问题: 

       按值传递方式下,ret是一个拷贝数据,是一个常量不能被修改,要想修改必须加mutable关键字。

   

   另一值得注意的是,' [] '中若写的是某一对象,像是下例中的btn2时,此Lambda表达式局部作用,只对btn2有效,从下例中也可看出 btn不能被捕获到。 

  • &a。将a按引用进行传递。
  • a,&b。将a按值进行传递,b按引用进行传递。
  • =,&a,&b。除a和b按引用进行传递外,其他参数都按值进行传递。
  • &,a,b。除a和b按值进行传递外,其他参数都按引用进行传递。

2. 操作符重载函数参数

标识重载的()操作符参数,没有参数时,这部分可以省略。参数可以通过按值和按引用方式传递。

3. 可修改的标识符

mutable --用于修改按值传递进来的变量

4. 函数返回值:

返回值 []()->type{}

->返回值类型,标识函数返回值的类型,当返回值为void,或函数体中中有一处return地方时,此部分都可以省略。

5. 函数体

    {}。标识函数的实现,函数体可以为空,但不能省略。

 

低版本想要运行Lambda表达式,需要在pro文件中加入

CONFIG += c++11

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值