我是靠谱客的博主 无语荔枝,这篇文章主要介绍[QT]lambda 引用传递的小问题,现在分享给大家,希望可以做个参考。

问题: 

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
mypushbta::mypushbta(QWidget *parent) : QMainWindow(parent), ui(new Ui::mypushbta) { int m=15; (QPushButton类型 btw 初始化省略) qDebug()<<m; connect(btw1,&QPushButton::clicked,this,[m]()mutable{m=110;qDebug()<<m;}); connect(btw2,&QPushButton::clicked,this,[&m](){m=120;qDebug()<<m;}); connect(btw3,&QPushButton::clicked,this,[&m](){qDebug()<<m;}); }

学习QT中的lambda表达式时遇到了问题:

对局部变量进行 按引用传递 时,初始值 和 原变量值不同,是一个垃圾数。

且赋值后不会改变原变量值。

简单来说:引用传递的 变量 和 原变量 已经不是同一个变量了(虽然变量名相同)

————————————————————

思路:

我们借用地址看一下构造情况。

从案例中可以看出

按引用传递地址是传过去了,可值却变成了垃圾数。

按值传递 值和原变量一样,但开辟了一个新地址。

这里需要提到的知识点:

lambda表达式中,

①按值传递参数为原变量的拷贝构造函数,不会影响原变量的值。但拷贝构造默认参数是const只读类型,修改时需要用mutable关键字强调。

②按引用传递可以看作传递原变量的地址。但局部函数的生命周期非常短。

可以看作:我们用传入的地址作为新的地址初始化,将原来的地址内容以NULL覆盖了。

————————————————

解决:

①把label这个变量做成成员变量,不要用局部变量了。

②引用传递的同时,把原值赋给地址。

最后

以上就是无语荔枝最近收集整理的关于[QT]lambda 引用传递的小问题的全部内容,更多相关[QT]lambda内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部