简述
lambda (来姆达啊) 很标准哈哈
英 /ˈlæmdə/ 美 /ˈlæmdə/
百度百科
“Lambda 表达式”(lambda
expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。
个人理解
匿名在于它不属于哪个类的方法,可以直接在函数内部进行实现。
你需要一个函数,但是又不想声明和命名函数,就可以使用匿名函数。
很意外的发现了这种表达式,还是在Java的Up主公众号上看到的。
误以为没C++什么事,后来发现在Java、Python和C++中都可以使用这种特性,C++11有支持。
Qt5.4版本以后均可以直接使用。之前的版本需要在pro文件中添加
CONFIG += c++11
这是由c++编译器 提供支持的
代码示例
先好奇 再讲语法
一个简单的按钮文本反转实现 点击“打开” 再点“关闭”
//WRONG connect(m_pBtnTest,SIGNAL(clicked()),[=](bool isCheck){
connect(m_pBtnTest,&QPushButton::clicked,[=](bool isCheck){
if(isCheck)
m_pBtnTest->setText("打开");
else
m_pBtnTest->setText("关闭");
});
省去了声明槽函数,定义槽函数的麻烦,是不是爽多了。很多时候根本就不想去声明槽函数,跳来跳去,就只想写那么一两句。早就想干掉这种麻烦,如今解决了。
lambda语法
以下只说常用的语法,3分钟学会 具体语法大家可以百度深入了解
一个完整的lambda表达式有以下5个部分 值传递方式、参数声明、修饰、返回类型、函数实现
[=] (QString strId) mutable ->int {
qDebug()<<strId;
}
- [] //不可省略 可为空
函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。
函数对象参数只能使用那些到定义 Lambda 为止时 Lambda 所在作用范围内可见的局部变量(包括 Lambda 所在类的 this)。函数对象参数有以下形式:
- = 值传递
- & 引用传递
- this 传递this指针
- m_strId 值方式传递变量 函数体内不可修改此变量的值 因为默认的是const 除非添加了mutable修饰
//可多种传递方式
[=,&m_strId,&m_strName] //m_strId m_strName 两个变量是引用方式传递 其他变量值传递
[&,=a] //除a 意外的变量都是引用方式传递
-
() //可省略不写
函数参数 -
mutable/exception //可省略不写
声明: 按值传递函数对象参数时,加上 mutable 修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。 -
-> //可省略不写
返回值类型 标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型) -
{} //不可省略 可为空
函数的具体实现
完整代码示例
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QPushButton>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initUI();
signals:
void sigClick(QString strText);
private:
QPushButton *m_pBtnTest;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
initUI();
}
void MainWindow::initUI()
{
m_pBtnTest = new QPushButton(this);
m_pBtnTest->move(20,20);
m_pBtnTest->setText("打开");
m_pBtnTest->setCheckable(true);
/*用法一*/
connect(m_pBtnTest,&QPushButton::clicked,[=](bool isCheck){
if(isCheck)
m_pBtnTest->setText("打开");
else
m_pBtnTest->setText("关闭");
emit sigClick(m_pBtnTest->text());
});
/*用法2*/
auto irq = [=](QString strBtnText){
qDebug()<<strBtnText;
};
connect(this,&MainWindow::sigClick,irq);
}