??代码资源:https://download.csdn.net/download/qq_36926037/85019729
6.1 基础概念
??C++11中,Lambda表达式用于定义并创建匿名函数对象,以简化编程工作。Lambda表达式的基本构成: ??[ capture ] ( parameters ) mutable ->return-type { statement }; ??[ 函数对象参数 ] ( 操作符重载函数参数) mutable ->返回值 { 函数体 }; ??参数: ?? (1)函数对象参数[ ]: []标识一个lambda函数的开始,不能省略,函数对象参数是传递给编译器自动生成的函数对象类的构造函数的,函数对象参数只能使用那些定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this),函数对象参数有以下几个形式: ????[ ]:没有使用任何函数对象参数 ????[=]:函数体内可以使用函数所在作用域范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)推荐值传递方式
????[&]: 函数体内可以使用函数所在作用域范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)推荐值传递 ????[this]:函数体内,可以使用函数所在类中的成员变量 ????[a]:将a进行按值传递,并且按值传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的,要修改传递进来的a的拷贝,可以添加mutable修饰符 ????[&a]:将a进行按引用传递 ????[=,&a]:除了a按引用,其他都是按值 ????… ??(2) 操作符重载函数参数(): 标识重载的()操作符的参数,没有参数时,这部分可以省略,参数可以通过按值和按引用两种方式进行传递 ?? (3)mutible可修改标识符: mutible声明,按值传递函数对象时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是修改拷贝,不是值本身) ??(4)返回值类型(函数返回值): 当返回值为void类型时,或者函数体中只有一处return的地方时,这部分可以省略 ??(5) 函数体 {}: 这部分不可以省略,但是可以为空
6.2 Lambda函数使用案例
??需求:利用Lambda函数表达式,实现点击按钮关闭窗口 ??(1)创建项目03qtproject,该项目包含一个窗口, ??(2)在窗口的原文件的构造函数中。使用lambda表达式,实现目标
#include "widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPushButton *btn1=new QPushButton;
btn1->setParent(this);
btn1->setText("第一个按钮");
QPushButton *btn2=new QPushButton;
btn2->setParent(this);
btn2->setText("第二个按钮");
btn2->move(200,200);
[=](){
btn1->setText("改名第一个按钮");
btn2->setText("改名第二个按钮");
}();
QPushButton *btn3=new QPushButton;
btn3->setParent(this);
btn3->setText("按钮1");
btn3->move(300,0);
QPushButton *btn4=new QPushButton;
btn4->setParent(this);
btn4->setText("按钮2");
btn4->move(300,100);
int a=10;
connect(btn3,&QPushButton::clicked,this,
[a]()mutable{a=a+100;qDebug()<<a;});
connect(btn4,&QPushButton::clicked,this,
[=](){qDebug()<<a;});
qDebug()<<a;
int b=[]()->int {return 100;}();
qDebug()<<b;
QPushButton *btn5=new QPushButton;
btn5->setParent(this);
btn5->setText("lambda案例");
btn5->move(500,200);
connect(btn5,&QPushButton::clicked,this,[=]()
{
this->close();
});
}
Widget::~Widget()
{
}
|