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;
```