Lambda表达式---c++11的特性 定义了一个可调用的匿名函数
简单介绍:C++11:lambda表达式_lambda表达式c++11-优快云博客
基本结构 [] () mutable(根据具体需求来决定是否使用该修饰符) -> 函数返回值类型{
函数体
} ()//()代表声明后直接调用
捕捉列表[ ]中常用的三个捕捉项
空 不使用任何函数对象参数
= 函数体内可以使用Lambda所在作用范围内的所有可见的局部变量 包含Lambda所在类的this 值传递方式
& 函数体内可以使用Lambda所在作用范围内的所有可见的局部变量 包含Lambda所在类的this 引用传递方式 一般不建议使用 引用传递代表要修改某个变量值 该变量值会被锁住 可能会带来一些问题
参数列表() 对应正常的函数参数列表
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)
函数体{}:在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。
在Qt中的应用:
直接应用在connect函数中代替槽函数
QPushButton * btn1 = new QPushButton("按钮一", this);
QPushButton * btn2 = new QPushButton("按纽二", this);
btn1->move(100, 100);
btn2->move(200, 200);
int num = 10;
//mutable修饰符可以使[]捕捉到的变量(被捕变量自带const属性)失去const属性 即可以对值进行修改
connect(btn1, &QPushButton::clicked, this, [num]()mutable{num = 20; qDebug() << num;});
connect(btn2, &QPushButton::clicked, this, [=](){qDebug() << num;});
qDebug() << num;
Lambda表达式的一个优点就在于可以代替槽函数,并且优势在于与信号的参数限制
信号的参数类型必须与槽函数的参数类型一一对应且参数个数不得少于槽函数的参数个数
如果采用Lambda表达式 参数列表为void 使用捕捉列表[ ]捕捉到变量应用到函数体中可以达到同样的效果 且对信号的参数就没有数量及类型的限制了
参考应用 函数体内可调用多个函数
connect(btn1, &QPushButton::clicked, this, [=](){
emit zhy->hungry("北京烤鸭");
});