• lambda表达式


    某视频介绍:

    // = :把外部所有局部变量、类中所有成员以值传递方式

    // 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内还是不能修改;

      

  • 相关阅读:
    hadoop2 作业执行过程之作业提交
    Hadoop各个服务端口列表
    基于 Nginx 和 FFmpeg 搭建流媒体服务器
    prometheus
    ubuntu 下dbus的环境搭建和使用
    Hadoop-Error: Could not find or load main class org.apache.hadoop.mapreduce.v2.app.MRAppMaster —
    Exception message: /bin/bash: line 0: fg: no job control
    P3942 将军令 [贪心]
    P3941 入阵曲
    P3941 入阵曲
  • 原文地址:https://www.cnblogs.com/qijunzifeng/p/13763387.html
Copyright © 2020-2023  润新知