QT 练习3:C++ lambda 表达式

2019-10-09  本文已影响0人  孙掌门
### C++ lambda 表达式

```
如果不支持 lambda , 需要在 .pro 文件中增加,CONFIG += C++11

    /* [](){},如果调用,后面增加(),[](){}()
     *[],代表开始,
     * 如果[]中传空,代表没有使用任何函数对象参数
     * =。函数体内可以使用 lambda所在范围内可见的局部变量(包括 lambda 所在类的 this),并且是值传递方式,相当于编译器为我们自动的按值传递了所有局部变量
     * &。函数体内可以使用 lambda 所在范围内的所有可见的局部变量(包括 lambda 所在类的 this),并且是引用传递方式,相当于编译器为我们自动的按照引用传递了所有的局部变量。
     * this。函数体内可以使用 lambda 所在类的成员变量
     * a。将 a 按值进行传递,内部只能使用a,不能使用别的,按值进行传递的时候,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的,要修改传递进来的a的拷贝可以加 mutable 修饰符
     * &a,将a按引用传递
     * a,&b。将a按值传递,b按引用传递
     * =,&a,&b。除了a,b按照引用传递,其余按照值传递
     *
     * */
```

### 例子

```
 //  例子
//    QPushButton *testBtn = new QPushButton("lambda",this);
//    // 值传递
//    [=](){
//       testBtn->setText("lambda test");
//       testBtn->move(200,200);
//    }();

    // 引用传递
//    QPushButton *testBtn = new QPushButton("lambda",this);
    // 值传递
//    [&](){
//       testBtn->setText("lambda test");
//       testBtn->move(200,200);
//    }();
    // a 传递
//    [testBtn](){
//       testBtn->setText("lambda test");
//       testBtn->move(200,200);
//       btn->setText("aaa");// 此行会报错
//    }();
    //mutable 关键字,用于修改当时的值,不影响整体
    QPushButton *testBtn1 = new QPushButton("mutable",this);
    QPushButton *testBtn2 = new QPushButton("qdebug",this);
    testBtn1->move(50,50);
    testBtn2->move(100,100);
    int m = 10;
    // mutable 关键字修改 m 的值
    connect(testBtn1,&QPushButton::clicked,this,[m]()mutable{
        // 改变 m 的值,
        m += 100;
        qDebug() << m;//110
    });
    connect(testBtn2,&QPushButton::clicked,this,[m](){
        qDebug() << m;//10
    });


    // 返回值
    int ret = []() ->int {return 1000;}();
    qDebug() << ret;
```

DEMO

上一篇下一篇

猜你喜欢

热点阅读