Lambda表达式

Lambda表达式

  • 语法格式
  • 调用

Lambda表达式是 C++ 11 最重要也是最常用的特性之一,在Qt中也可以使用Lambda表达式。
Lambda表达式_第1张图片

语法格式

    [capture](params) opt -> ret {body;};
    - capture: 捕获列表
    - params: 参数列表
    - opt: 函数选项
    - ret: 返回值类型
    - body: 函数体
  • 捕获列表: 捕获一定范围内的变量
    [] - 不捕捉任何变量
    [&] - 捕获外部作用域中所有变量, 并作为引用在函数体内使用 (按引用捕获)
    [=] - 捕获外部作用域中所有变量, 并作为副本在函数体内使用 (按值捕获)
       拷贝的副本在匿名函数体内部是只读的
      (如果在函数中想修改值,需要加上mutable关键字,但是外部数据不会发生变化)
    [=, &foo] - 按值捕获外部作用域中所有变量, 并按照引用捕获外部变量 foo
    [bar] - 按值捕获 bar 变量, 同时不捕获其他变量
    [&bar] - 按引用捕获 bar 变量, 同时不捕获其他变量
    [this] - 捕获当前类中的this指针
      让lambda表达式拥有和当前类成员函数同样的访问权限
      如果已经使用了 & 或者 =, 默认添加此选项
  • 参数列表: 和普通函数的参数列表一样
  • opt 选项 –> 可以省略
    mutable: 可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)
    exception: 指定函数抛出的异常,如抛出整数类型的异常,可以使用throw();
  • 返回值类型:
    标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略
  • 函数体:
    函数的实现,这部分不能省略,但函数体可以为空。

在函数中可以直接定义一个匿名函数,并可以直接调用他。

    // 在匿名函数外部定义变量
    int aa = 11;
    QString bb = "hello";
    // 匿名函数的定义
    [](){
        qDebug() <<"匿名函数的定义";
    };
    // 调用匿名函数
    [](){
        qDebug() <<"调用匿名函数";
    }();

    // 打印外部变量的值
    [&](){
        qDebug() <<"打印外部变量的值";
        qDebug() << "aa:" << aa << ", bb: " << bb ;  // error, 不能使用任何外部变量
    }();

    [&](int a,QString b) mutable  {
        qDebug() <<"调用有参匿名函数 (引用) ";
        qDebug()<<"aa = "<<aa<<"\t\tbb = "<<bb<<"\t\ta = "<<a<<"\t\tb = "<<b;
    }(111,"hello every one");

    // 值拷贝的方式使用外部数据
    [=](int m, int n)mutable{
        qDebug() << "使用拷贝的方式传递数据: ";
        // 拷贝的外部数据在函数体内部是只读的, 如果不添加 mutable 关键字是不能修改这些只读数据的值的
        // 添加 mutable 允许修改的数据是拷贝到函数内部的副本, 对外部数据没有影响
        qDebug() << "a+1:" << aa++ << ", bb+\"xxx\"= " << bb+"xxx";
        qDebug() << "m+1: " << ++m << ", n: " << n;
    }(1, 2);

    //加上返回值
    int res = [&](int a,QString b) mutable ->int {
        qDebug() <<"调用有参匿名函数 (引用),并使用返回值int ";
        qDebug()<<"aa = "<<aa<<"\t\tbb = "<<bb<<"\t\ta = "<<a<<"\t\tb = "<<b;
        return 100;
    }(111,"hello every one");
    qDebug()<<"返回值为"<<res;

Lambda表达式_第2张图片

调用

qt5中使用匿名函数做为槽函数:

  1. 不使用匿名函数:
void MainWindow::receiveMsg()
{
    qDebug()<<"调用了一次";
    tom->sendMsg();
}
    tom = new me(this);
    myteacher = new teacher(this);
    connect(ui->myPushButton1,&QPushButton::clicked,this,&MainWindow::receiveMsg);
    connect(tom,&me::sendMsg,myteacher,&teacher::receiveMsg);

在这里插入图片描述
2. 使用匿名函数

    tom = new me(this);
    myteacher = new teacher(this);
    connect(ui->myPushButton1,&QPushButton::clicked,this,[=](){
        qDebug() <<"调用一次";
        tom->sendMsg();
    });
    connect(tom,&me::sendMsg,myteacher,&teacher::receiveMsg);

在这里插入图片描述

你可能感兴趣的:(Qt开发,qt)