c++11的lambda表达式在qt信号槽connect使用

在c++11中引入了lambda表达式,就是匿名函数,可以直观看到函数执行过程,提高程序运行效率,因为不牵涉到函数参数的入栈调用。匿名函数本身只是一个函数指针,如要调用,后面要加(参数)。

lambda函数的使用场景:
    1、一些短小的函数,但只使用一次的。
    2、配合STL泛型算法使用,比如sort(begin,end,function)这里function就可以用lambda函数。
    3、回调函数。

lambda函数被设计的目的,就是要就地书写,就地使用。使用lambda的用户,更倾向于在一个屏幕里看到所有的代码,而不是依靠代码浏览工具在文件间找到函数的实现。在封装的思维层面上,lambda只是一种局部的封装,以及局部的共享。而需要全局共享的代码逻辑,我们还是需要用标准函数封装起来。

在 lambda 表达式最前面操作符[ ]里的“captures”称为“捕获列表”,可以捕获表达式外部作用域的变量,在函数体内部直接使用,这是与普通函数或函数对象最大的不同。
捕获列表里可以有多个捕获选项,以逗号分隔,使用了略微“新奇”的语法,规则如下

    [ ]        :无捕获,函数体内不能访问任何外部变量
    [ =]      :以值(拷贝)的方式捕获所有外部变量,函数体内可以访问,但是不能修改。
    [ &]      :以引用的方式捕获所有外部变量,函数体内可以访问并修改(需要当心无效的引用);
    [ var]   :以值(拷贝)的方式捕获某个外部变量,函数体可以访问但不能修改。
    [ &var] :以引用的方式获取某个外部变量,函数体可以访问并修改
    [ this]   :捕获this指针,可以访问类的成员变量和函数,
    [ =,&var] :引用捕获变量var,其他外部变量使用值捕获。
    [ &,var]:只捕获变量var,其他外部变量使用引用捕获。

下面演示代码(QT环境):

    qDebug()<<"列表合并到字符串-lambda表达式使用";
    QStringList sls={"abc","haha","张三"};//定义一个列表
    sls<
    sls.insert(sls.begin(),"王五");//在头部添加
    sls.append("赵六");//在末尾追加
    i=sls.count();//获取列表数目
    //定义一个lambda表达式,格式:[捕获列表](参数)->返回类型{函数体};
    int strl=[=,&str](int &n)->int{//以引用方式&使用str,其他变量以值=传递。参数n也是引用。返回一个int类型。
        str=sls.join("|");//QStringList的join方法是以某字符串合并到QString,相反的是QString的split方法是以某字符串分割到QStringList。
        qDebug()<<"n数目:"<
        n+=10;//修改n的值,因为是引用,所以可以修改。
        return str.length();//返回字符串的长度
    }(i);//加(i)才是函数调用,如是空参数,则加();如是
    qDebug()<<" 长度:"<

在qt信号槽连接中,也可以使用lambda表达式来简化代码:

signals:
    void hungry(int i);//饿了这样一个信号,传递一个int类型变量参数

public slots:

    void eatfun(int i);//响应饿了信号,定义吃饭槽函数
    //connect(this,&MainWindow::hungry,this,&MainWindow::eatfun);//这是通用连接写法,一个hungry信号,一个eatfun槽函数
    connect(this,&MainWindow::hungry,[](int ih){//使用lambda表达式,因为hungry是有一个int参数,所以后面的槽函数也需要传入一个参数int ih
        if(ih==2)
            qDebug()<<"发的饿了信号2-"< 
  
    });

你可能感兴趣的:(c++,qt)