Lambda表达式
C++11中的Lambda表达式用于定义并创建匿名的函数对象,以简化编程工作
Lambda表达式基本构成:
[capture](parameters)mutable->return-type
{
statement
}
[函数对象参数](操作符重载函数参数)mutable->返回值(函数体)
{函数实现体}
例如:
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPushButton* btn = new QPushButton("下课", this);
[=]{
btn->setText("上课");
}();
}
1. 函数对象参数
[],标识一个Lambda的开始,这部分必须存在。函数对象参数时传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用到哪些定义到Lambda前,Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this)。函数对象参数有以下形式:
- 空。没有使用任何函数对象参数;
- =。函数体内可以使用Lambda所在作用范围内所有可见的局部变量,是值传递的方式。
- &。函数体内可以使用Lambda所在作用范围内所有可见的局部变量,是以引用传递方式。
通常建议使用=。
原因:
// 执行此段代码
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPushButton* btn = new QPushButton("下课", this);
connect(btn, &QPushButton::clicked, this, [=](){
btn->setText("上课");
});
}
点击"下课"按钮后:
而将 '=' 改为 '&',点击"下课"按钮后:
这是因为:做信号槽连接,默认内部变量会进行锁状态,只读状态,如果进行写操作,就会挂掉。
- this。函数体内可以使用Lambda所在类中的成员变量,以值传递方式。
- a。将a按值进行传递。按值进行传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的。要修改传递进来的a的拷贝,可以添加mutable修饰符。
如下所示问题:
按值传递方式下,ret是一个拷贝数据,是一个常量不能被修改,要想修改必须加mutable关键字。
另一值得注意的是,' [] '中若写的是某一对象,像是下例中的btn2时,此Lambda表达式局部作用,只对btn2有效,从下例中也可看出 btn不能被捕获到。
- &a。将a按引用进行传递。
- a,&b。将a按值进行传递,b按引用进行传递。
- =,&a,&b。除a和b按引用进行传递外,其他参数都按值进行传递。
- &,a,b。除a和b按值进行传递外,其他参数都按引用进行传递。
2. 操作符重载函数参数
标识重载的()操作符参数,没有参数时,这部分可以省略。参数可以通过按值和按引用方式传递。
3. 可修改的标识符
mutable --用于修改按值传递进来的变量
4. 函数返回值:
返回值 []()->type{}
->返回值类型,标识函数返回值的类型,当返回值为void,或函数体中中有一处return地方时,此部分都可以省略。
5. 函数体
{}。标识函数的实现,函数体可以为空,但不能省略。
低版本想要运行Lambda表达式,需要在pro文件中加入
CONFIG += c++11