某视频介绍:
// = :把外部所有局部变量、类中所有成员以值传递方式
// this : 类中所有成员以值传递方式
// & :把外部所有局部变量,不包括类中的成员, 引用符号 (我验证后类中的成员也可以包括???有点晕)
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { // sum = 32; b1 = new QPushButton(this);
QPushButton *b4 = new QPushButton(this); b1->setText("close"); b1->move(100, 100); b2.setParent(this); b2.setText("show"); b3.setParent(this); b3.move(150, 150); b3.setText("Lamda表达式"); int a=2,b=5; connect(b1, &QPushButton::clicked, this, &MyWidget::close); connect(&b2, &QPushButton::released, this, &MyWidget::showSub); connect(&sub, &SubWidget::showMy, this, &MyWidget::showMyWidget); void (SubWidget::*showDebug)() = SubWidget::showDebugSignal; void (SubWidget::*showDebugWithInfo)(int, QString) = SubWidget::showDebugSignal; connect(&sub, showDebug, this, &MyWidget::outPutDebug); connect(&sub, showDebugWithInfo, this, &MyWidget::outPutDebugTest); connect(&b3, &QPushButton::clicked, [&]() //mutable { qDebug() << "lamda111"; b3.setText("lamda done"); qDebug() << a << b; qDebug() << sum; } ); } 按下b3 按钮,程序输出 lamda111 0 22062380 23
分析原因,connect里的&b3 因为是this的子对象,父对象不消亡,子对象没主动析构不会消亡。所以[&]传引用的情况下lambda表达式内对b3操作没问题,但是a和b两个局部变量就不行了,构造函数运行完后,栈上的局部变量就会释放掉,所以输出a和b的值为 0 22062380 出错了。而sum是在头文件里给了初始值的成员变量,够着函数运行完后还是存在的,所以sum打印正常。
由于上面课程讲的和我验证的有点不符合,就查了下准备查下lambda详细内容。
lambda表达式产生的原因:
当条件限制只能传一个参数,但是算法需要传递更多的参数的情况下,用lambda解决。
lambda表达式介绍:
四种可调用对象之一,四种分别为函数、函数指针、lambda表达式、重载了函数运算符的类。
完整形式:
[capture list](parameter list) -> return type {function body}
最简形式:
必须有捕获列表和函数体
如:auto f = [ ] {return 42;};
cout << f() << endl; //调用方式与普通函数相同
捕获列表捕获时间:
lambda定义出来就是一个新类;
函数传递一个lambda,生成一个未命名对象; 使用auto定义一个lambda初始化变量,从lambda生成类型对象;
lambda生成的类包含一个lambda捕获变量的数据成员, lambda对象创建时初始化此成员。 创建对象时捕获而不是调用时捕获。
static变量:不用捕获,lambda直接用,值会随外部修改变化
成员变量:(不=且不& ,lambda内无法用)无论用=还是用&捕获,其实都是捕获的this,值会随外部修改变化。
=拷贝捕获的加mutable ,变量lambda内能修改;
&引用捕获的const变量 ,变量lambda内还是不能修改;