Lambda表达式是 C++ 11 最重要也是最常用的特性之一,在Qt中也可以使用Lambda表达式。
语法格式
[capture](params) opt -> ret {body;};
- capture: 捕获列表
- params: 参数列表
- opt: 函数选项
- ret: 返回值类型
- body: 函数体
- 捕获列表: 捕获一定范围内的变量
[] - 不捕捉任何变量
[&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
[=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
拷贝的副本在匿名函数体内部是只读的
(如果在函数中想修改值,需要加上mutable关键字,但是外部数据不会发生变化)
[=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
[bar] - 按值捕获 bar 变量, 同时不捕获其他变量
[&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量
[this] - 捕获当前类中的this指针
让lambda表达式拥有和当前类成员函数同样的访问权限
如果已经使用了 & 或者 =, 默认添加此选项 - 参数列表: 和普通函数的参数列表一样
- opt 选项 –> 可以省略
mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw(); - 返回值类型:
标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略 - 函数体:
函数的实现,这部分不能省略,但函数体可以为空。
在函数中可以直接定义一个匿名函数,并可以直接调用他。
// 在匿名函数外部定义变量
int aa = 11;
QString bb = "hello";
// 匿名函数的定义
[](){
qDebug() <<"匿名函数的定义";
};
// 调用匿名函数
[](){
qDebug() <<"调用匿名函数";
}();
// 打印外部变量的值
[&](){
qDebug() <<"打印外部变量的值";
qDebug() << "aa:" << aa << ", bb: " << bb ; // error, 不能使用任何外部变量
}();
[&](int a,QString b) mutable {
qDebug() <<"调用有参匿名函数 (引用) ";
qDebug()<<"aa = "<<aa<<"\t\tbb = "<<bb<<"\t\ta = "<<a<<"\t\tb = "<<b;
}(111,"hello every one");
// 值拷贝的方式使用外部数据
[=](int m, int n)mutable{
qDebug() << "使用拷贝的方式传递数据: ";
// 拷贝的外部数据在函数体内部是只读的, 如果不添加 mutable 关键字是不能修改这些只读数据的值的
// 添加 mutable 允许修改的数据是拷贝到函数内部的副本, 对外部数据没有影响
qDebug() << "a+1:" << aa++ << ", bb+\"xxx\"= " << bb+"xxx";
qDebug() << "m+1: " << ++m << ", n: " << n;
}(1, 2);
//加上返回值
int res = [&](int a,QString b) mutable ->int {
qDebug() <<"调用有参匿名函数 (引用),并使用返回值int ";
qDebug()<<"aa = "<<aa<<"\t\tbb = "<<bb<<"\t\ta = "<<a<<"\t\tb = "<<b;
return 100;
}(111,"hello every one");
qDebug()<<"返回值为"<<res;
调用
qt5中使用匿名函数做为槽函数:
- 不使用匿名函数:
void MainWindow::receiveMsg()
{
qDebug()<<"调用了一次";
tom->sendMsg();
}
tom = new me(this);
myteacher = new teacher(this);
connect(ui->myPushButton1,&QPushButton::clicked,this,&MainWindow::receiveMsg);
connect(tom,&me::sendMsg,myteacher,&teacher::receiveMsg);
2. 使用匿名函数
tom = new me(this);
myteacher = new teacher(this);
connect(ui->myPushButton1,&QPushButton::clicked,this,[=](){
qDebug() <<"调用一次";
tom->sendMsg();
});
connect(tom,&me::sendMsg,myteacher,&teacher::receiveMsg);