lambda 表达式说明:
含义:lambda表达式是定义匿名函数对象的便捷方法,直接在调用或作为参数传递的函数位置.
表达式示例: [=] ( ) mutable throw( ) -> int { }
由6个部分组成
1.capture子句(C++规范中也称为lambda引入器).
详细说明:
捕获外部变量列表 = 是以传值的方式引用 & 是以引用的方式引用.
值捕获:[a]{cout << a << endl}
引用捕获:
int a = 123;
[&a]{cout << a << endl};
a = 321;
输出结果a:321
隐式捕获:编译器根据函数体中的代码来推断需要捕获哪些变量.
[=] 表示以值捕获的方式捕获外部变量
[&] 表示以引用捕获的方式捕获外部变量
混合方式:
[] 不捕获任何外部变量
[变量名,...] 默认以值的形式捕获指定的多个外部变量,如果引用捕获需要使用&说明
[this] 以值的形式捕获this指针
[=] 以值的形式捕获所有外部变量
[&] 以引用的形式捕获所有外部变量
[=, &x] 变量x以引用的形式捕获,其余变量以传值的形式捕获
[&, x] 变量x以值的形式捕获,其余变量以引用的形式捕获
2.参数列表(可选).(也称作为lambda声明符)
3.可变规范(可选).用来说名是否可以修改捕获的变量,const.
4.exception-specification(可选). 异常设定
5.trailing-return-type(可选). 返回类型
6.lambda正文. 函数体
实例一:定义一个并且调用:
#include "mainwindow.h" #include "QDebug" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { //定义一个lambda表达式 [](){ qDebug()<<"表达式"; }();// 直接() 直接调用 } MainWindow::~MainWindow() { }
实例二:传入一个值入参
#include "mainwindow.h" #include "QDebug" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { int m=10; //定义一个lambda表达式 [m](){ qDebug()<<"表达式"<<m; }();// 直接() 直接调用 } MainWindow::~MainWindow() { }
实例三:传入值入参,修改(函数内副本修改)
#include "mainwindow.h" #include "QDebug" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { int m=10; //定义一个lambda表达式 [m]() mutable{ m = m+1; qDebug()<<"表达式"<<m; }();// 直接() 直接调用 } MainWindow::~MainWindow() { }
实例四:绑定信号槽
#include "mainwindow.h" #include "QDebug" #include "QPushButton" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { QPushButton *btn = new QPushButton(); btn->setText("按钮"); btn->setParent(this); btn->resize(100,20); int m=10; //定义一个lambda表达式 connect(btn,&QPushButton::clicked,this,[m]() mutable{ m = m+1; qDebug()<<"表达式"<<m; }); } MainWindow::~MainWindow() { }