QT-Lanbda表达式

Lanbda表达式

C++11中的Lambda表达式用于定义匿名的函数对象,以简化编程工作。

首先看一下Lambda表达式的基本构成

[capture](parameters)opt -> retType {
    ......
}

[局部变量捕获列表](函数参数)函数额外属性设置opt 函数返回值->retype{函数主体}

1.1 局部变量引入方式 [ ]

[ ] : 标识一个Lambda的开始不可省略

[ ] 局部变量捕获列表
[ ] lambda表达式不能访问外部函数体的任何局部变量
[a] 在函数体内部使用值传递的方式访问a变量
[&b] 在函数体内部使用引用传递的方式访问b变量
[=] 函数外的所有局部变量都通过值传递的方式使用, 函数体内使用的是副本
[&] 引用的方式使用lambda表达式外部的所有变量
[=, &foo] foo使用引用方式, 其余是值传递的方式
[&, foo] foo使用值传递方式,其余引用传递
[this] 在函数内部可以使用类的成员函数和成员变量,=和&形式也都会默认引入

由于引用方式捕获对象会有局部变量释放了而lambda函数还没有被调用的情况。如果执行lambda函数那么引用传递方式捕获进来的局部变量的值不可预知。所以在无特殊情况下建议使用的形式[=](){}

1.2 函数参数()

(params)表示lambda函数对象接收的参数,类似于函数定义中的小括号表示函数接收的参数类型和个数。参数可以通过按值(如:(int a,int b))和按引用(如:(int &a,int &b))两种方式进行传递。

函数参数部分可以省略,省略后相当于无参的函数。

1.3 选项Opt

Opt 部分是可选项,最常用的是mutable声明,这部分可以省略

外部函数局部变量通过值传递引进来时,其默认是const,所以不能修改这个局部变量的拷贝,加上mutable就可以修改。

QPushButton * myBtn = new QPushButton(this);
QPushButton * myBtn2 = new QPushButton(this);
int m = 10;
myBtn->move(300, 100);
myBtn2->move(500, 100);
// 添加mutalbe声明后,可以修改局部变量m的拷贝
connect(myBtn, &QPushButton::clicked, this, [m]()mutable{m = 20; qDebug() << m;});
connect(myBtn2, &QPushButton::clicked, this, [=](){qDebug()<< m;});

1.4 函数返回值 ->

->retType,标识lambda函数返回值的类型。这部分可以省略,但是省略并不代表函数没有返回值编译器会自动根据函数体内的return语句判断返回值类型,但是如果有多条return语句,而且返回的类型都不一样,编译会报错。

// 返回值类型
int num = [=]()->int{
    return 1000;
}();
qDebug() << num;

1.5 函数主体

{},标识函数的实现,不能省略,但函数体可以为空。

1.6 槽函数使用Lambda表达式

以QPushButton点击事件为例:

connect(btn, &QPushButton::clicked, [=](){qDebug() << "Clicked";});

这里可以看出使用Lambda表达式作为槽的时候可以不需要填入信号的接收者

当点击按钮的时候,clicked信号被触发,lambda表达式也会直接运行。当然lambda表达式还可以指定函数参数,这样也就能够接收到信号函数传递过来的参数了。

由于lambda表达式比我们自己自定义槽函数要方便而且灵活得多,所以在实现槽函数的时候优先考虑使用Lambda表达式。一般我们的使用习惯也是lambda表达式外部函数的局部变量全部通过值传递捕获进来,也就是: [=](){ }的形式。

posted @   Happinesspill  阅读(256)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示