概述
问题:
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 引用传递的小问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复