06Lambda表达式
代码资源: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,该项目包含一个窗口QWidget类,详细创建步骤参考博客:https://blog.csdn.net/qq_36926037/article/details/123720720 项目结构如图所示:
(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);
//lambda函数声明
// [=](){
// btn1->setText("改名第一个按钮");
// btn2->setText("改名第二个按钮");
// };
[=](){
btn1->setText("改名第一个按钮");
btn2->setText("改名第二个按钮");
}();
//mutable关键字
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;
//利用lambda函数实现点击按钮关闭窗口
QPushButton *btn5=new QPushButton;
btn5->setParent(this);
btn5->setText("lambda案例");
btn5->move(500,200);
connect(btn5,&QPushButton::clicked,this,[=]()
{
this->close();
//关闭窗口的代码,也可以填入槽函数,或者信号等。。。
});
}
Widget::~Widget()
{
}