lambda表达式就是无名函数(没有函数名子的函数)
表现形式:[捕获列表] (参数列表) ->返回类型{函数体}
#include <iostream>
using namespace std;
int Sum(int a,int b)
{
return a+b;
}
int main()
{
//lambda表达式就是无名函数(没有函数名子的函数)
//下面是一个完整的lambda表达式模型,实现功能和Sum一样
//[]捕获列表 ()参数列表 ->返回类型
/*
[](int a,int b)->int{
//函数体
return a+b;
}
*/
//使用方法:lambda表达式后跟(1,2)表示把1,2实参赋int a,int b
//对比Sum函数就相当于Sum(1,2),然后用cout输出函数返回值
int a = [](int a,int b)->int{
return a+b;
}(1,2);
int b = Sum(1,2);
cout << a << b <<endl;
//从上面的使用可以归纳出整个lambda表达式在使用中就相当于一个函数名,
//同时从过去学到的知识中知道,函数名就是函数的地址
//能否顶一个函数指针指向该表达呢?
int (*pFunc)(int,int) =[](int a,int b)->int{
return a+b;
};
cout<<(*pFunc)(2,3)<<endl;
//实践证明确实可行,输出了5
return 0;
}
auto关键字
#include <iostream>
using namespace std;
int main()
{
//auto关键字可以根据右边的值,自动推到左边值变量的类型
auto Func =[](int a,int b)->int{
return a+b;
};
cout<<Func(2,3)<<endl;
return 0;
}
[捕获列表] 的一些关键字
从我们过去学到的知道知道,{}一般是一个命名空间,或者叫作用域, 通常作用域之间是不能相互访问的,我们使用[捕获列表]来引入上一层作用域中的变量值
#include <iostream>
using namespace std;
int main()
{
int m = 10,n = 1;
cout<< [m]() -> int {return m;}() <<endl;
//捕获main作用域中的m变量,把m变量的值赋值给形参m,注意:形参m是const类型的,无法修改
//cout<< [m]() -> int {m=m+1;return m;}() <<endl;
//error:cannot assign to a variable captured by copy in a non-mutable lambda
//我想修改形参m的值怎么办?引入mutable关键字
cout<< [m]() mutable -> int {m=m+1;return m;}() <<endl;
//我想同时使用main作用域中的m,n的值怎么办?
cout<< [m,n]() mutable -> int {m=m+1;return m+n;}() <<endl;
//形参一个个写书出来太麻烦,使用=表示使用main中所有变量
cout<< [=]() mutable -> int {m=m+1;return m+n;}() <<endl;
cout << m << " " <<n << endl;
//我想修改main作用域中的m,但是修改n的值,哎,引用来了
cout<< [&m,n]() mutable -> int {m=m+1;return m+n;}() <<endl;
cout << m << " " <<n << endl;
//同理引用参数一个个写书出来太麻烦,我想全部引用
cout<< [&]() mutable -> int {m=m+1;n=n+1;return m+n;}() <<endl;
cout << m << " " <<n << endl;
return 0;
}
额外提醒:如果lambda表达式在一个类中,使用=和&时,默认将lambda所在类的this也引入了
[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}
关于exception以后在研究
函数式编程
#include <iostream>
using namespace std;
int main()
{
//函数式编程 多用于 多线程 并发
int a = [](int n){
return [n](int x){
return n+x;
}(1);
}(2);
cout << a << endl;
auto Func = [](int n){
return [n](int x){
return n+x;
};
};
int b = Func(1)(2);
cout << b << endl;
return 0;
}
lambda表达式,[=]表示值传递方式捕捉所有父作用域的变量。
lambda表达式再Qt中的使用
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QPushButton>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
QPushButton* ipushbutton;
};
#endif // WIDGET_H
#include "Widget.h"
#include <QPushButton>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
//ipushbutton = new QPushButton("hello",this);
//connect(this->ipushbutton,&QPushButton::clicked,this,[=](){this->ipushbutton->setText("world");});
auto pushbutton = new QPushButton("hello",this);
//connect(pushbutton,&QPushButton::clicked,this,[=](){pushbutton->setText("world");});
connect(pushbutton,&QPushButton::clicked,[=](){pushbutton->setText("world");});
}
Widget::~Widget()
{
}
额外提醒
lambda表达式是C++11中引入的概念,所以需要修改pro文件
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11