C++中lambda表达式以及在QT中的使用

lambda表达式就是无名函数(没有函数名子的函数)

表现形式:[捕获列表] (参数列表) ->返回类型{函数体}

#include <iostream>

using namespace std;

int Sum(int a,int b)
{
    return a+b;
}

int main()
{
    //lambda表达式就是无名函数(没有函数名子的函数)

    //下面是一个完整的lambda表达式模型,实现功能和Sum一样
    //[]捕获列表 ()参数列表 ->返回类型
    /*
     [](int a,int b)->int{
        //函数体
        return a+b;
    }
    */

    //使用方法:lambda表达式后跟(1,2)表示把1,2实参赋int a,int b
    //对比Sum函数就相当于Sum(1,2),然后用cout输出函数返回值
    int a = [](int a,int b)->int{
        return a+b;
    }(1,2);
    int b = Sum(1,2);
    cout << a << b <<endl;

    //从上面的使用可以归纳出整个lambda表达式在使用中就相当于一个函数名,
    //同时从过去学到的知识中知道,函数名就是函数的地址
    //能否顶一个函数指针指向该表达呢?
    int (*pFunc)(int,int) =[](int a,int b)->int{
        return a+b;
    };
    cout<<(*pFunc)(2,3)<<endl;
    //实践证明确实可行,输出了5

    return 0;
}

auto关键字 

#include <iostream>

using namespace std;

int main()
{
    //auto关键字可以根据右边的值,自动推到左边值变量的类型
    auto Func =[](int a,int b)->int{
        return a+b;
    };
    cout<<Func(2,3)<<endl;

    return 0;
}

[捕获列表] 的一些关键字

从我们过去学到的知道知道,{}一般是一个命名空间,或者叫作用域, 通常作用域之间是不能相互访问的,我们使用[捕获列表]来引入上一层作用域中的变量值

#include <iostream>
using namespace std;

int main()
{
    int m = 10,n = 1;

    cout<< [m]() -> int {return m;}() <<endl;
    //捕获main作用域中的m变量,把m变量的值赋值给形参m,注意:形参m是const类型的,无法修改

    //cout<< [m]() -> int {m=m+1;return m;}() <<endl;
    //error:cannot assign to a variable captured by copy in a non-mutable lambda

    //我想修改形参m的值怎么办?引入mutable关键字
    cout<< [m]() mutable -> int {m=m+1;return m;}() <<endl;

    //我想同时使用main作用域中的m,n的值怎么办?
    cout<< [m,n]() mutable -> int {m=m+1;return m+n;}() <<endl;

    //形参一个个写书出来太麻烦,使用=表示使用main中所有变量
    cout<< [=]() mutable -> int {m=m+1;return m+n;}() <<endl;
    cout << m << " " <<n << endl;

    //我想修改main作用域中的m,但是修改n的值,哎,引用来了
    cout<< [&m,n]() mutable -> int {m=m+1;return m+n;}() <<endl;
    cout << m << " " <<n << endl;

    //同理引用参数一个个写书出来太麻烦,我想全部引用
    cout<< [&]() mutable -> int {m=m+1;n=n+1;return m+n;}() <<endl;
    cout << m << " " <<n << endl;

    return 0;
}

额外提醒:如果lambda表达式在一个类中,使用=和&时,默认将lambda所在类的this也引入了

[函数对象参数] (操作符重载函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

关于exception以后在研究

C++之Lambda表达式 - 季末的天堂 - 博客园1. 概述 C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。 Lambda 的语法形式如下: 可以看到,Lambda 主要分为五个部分:[函数对象参数]、(操作符https://www.cnblogs.com/jimodetiantang/p/9016826.html

C++异常处理try throw catch的用法样例_听风雨-CSDN博客1、C++标准异常类用法#include <iostream> #include <exception> using namespace std; int main () { try { int* myarray= new int[100000]; } catch (exception& e) { cout << "Standard excepthttps://blog.csdn.net/birenxiaofeigg/article/details/116231745

函数式编程

#include <iostream>

using namespace std;

int main()
{
    //函数式编程 多用于 多线程 并发
    int a = [](int n){
        return [n](int x){
            return n+x;
        }(1);
    }(2);
    cout << a << endl;

    auto Func = [](int n){
        return [n](int x){
            return n+x;
        };
    };
    int b = Func(1)(2);
    cout << b << endl;

    return 0;
}

 lambda表达式,[=]表示值传递方式捕捉所有父作用域的变量。

深入理解c++中的Lambda表达式_guotianqing的博客-CSDN博客Lambda简介Lambda表达式最重要的特点就是能够极其方便地创建函数对象。其实,Lambda表达式能做到的事情,手工都能做到,无非就是多打一些字。但是,Lambda表达式提供的简洁、易用、功能之强大,真是香啊!总的来说,Lambda表达式经常用于以下场景:标准库STL中使用,如std::find_if, std::remove_if, std::count_if等自定义比较函数...https://blog.csdn.net/guotianqing/article/details/103843256

【C++11新特性】 Lambda表达式_上善若水,人淡如菊-CSDN博客C++11的一大亮点就是引入了Lambda表达式。利用Lambda表达式,可以方便的定义和创建匿名函数。对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多高级语言在很早以前就已经提供了Lambda表达式的功能,如C#,Python等。今天,我们就来简单介绍一下C++中Lambda表达式的简单使用。https://blog.csdn.net/Xiejingfa/article/details/50715220

 lambda表达式再Qt中的使用

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPushButton>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private:
    QPushButton* ipushbutton;
};
#endif // WIDGET_H


#include "Widget.h"
#include <QPushButton>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    //ipushbutton = new QPushButton("hello",this);
    //connect(this->ipushbutton,&QPushButton::clicked,this,[=](){this->ipushbutton->setText("world");});

    auto pushbutton = new QPushButton("hello",this);
    //connect(pushbutton,&QPushButton::clicked,this,[=](){pushbutton->setText("world");});
    connect(pushbutton,&QPushButton::clicked,[=](){pushbutton->setText("world");});
}

Widget::~Widget()
{
}

额外提醒

lambda表达式是C++11中引入的概念,所以需要修改pro文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值