Qt中使用匿名函数lambda表达式
一、为什么要使用匿名函数lamdba
首先,lambda表达式可以使代码变得简单,C++中,一个lambda表达式表示一个可调用的代码单元。如代码:
#include <QCoreApplication>
#include <QDebug>
#include <QSharedPointer> int func2(int i)
{
i += 2;
return i+4;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv); auto func1 = [](int i) {i += 2; return i+4; };
qDebug()<< "func2: " << func2(6) << '\n';
qDebug()<< "func1: " << func1(6) << '\n'; return a.exec();
}
如上,对于一个简单的计算,我们可以通过定义函数的形式,或者使用匿名函数的方法来实现。当然,如果这个函数功能十分简单,不会被重复使用,又不至于单独写一个函数,可以通过匿名函数简化代码:
int result = 0;
bool isAdd = false;
result = isAdd? [](int a,int b){return a+b;}(10,5):[](int a,int b){return a-b;}(10,5);
qDebug()<<result<<endl;
如上可以简单的示例简化的作用。
二、匿名函数中于外部的交互
int n = 2;
qDebug()<<[n](int n1){return n1+n;}(3)<<endl;
如上,方括号[]用来传递局部变量,可在[]内枚举函数体内需要用到的局部变量。使用[=]则外部的所有变量函数体内都可使用。同理[&]用引用的方法也相同,但是如果需要引用的变量是动态的,例如指针,则这种方法可能会引发出错,内存释放不及时,导致其他变量的值出错。[this]这也类似,都能使用函数体外部的变量。
如果想要修改操作外面的变量:
int n = 2;
qDebug()<<[&](int n1){n = 3;return n1+n;}(3)<<endl; //6
qDebug()<<n<<endl; //3
注意,[] 里面获取n和通过=获取所有的变量都只是只读的,不能修改!!!如果只是想要内部修改,不改变局部变量实际值的话,可以通过关键字 mutable实现:
int n = 2;
qDebug()<<[=](int n1)mutable {n = 3;return n1+n;}(3)<<endl; //6
qDebug()<<n<<endl; //2
三、匿名函数在connect中的使用
事实上,匿名函数作为一个槽函数是非常方便的。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); int n = 0;
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout,this, [=]()mutable {n += 1;qDebug()<<n<<endl;});
timer->start(1000); }
注意,lamda匿名函数对应的信号必须是函数指针的形式。
注意:通过mutable的使用,如果是类中的变量的话,是可以修改的,如果是局部变量是修改不了的,代码示例:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
n = 0;
QTimer *timer = new QTimer(this);
connect(timer, &QTimer::timeout,this, [=]()mutable {n += 1; if(n == 3){timer->stop();}qDebug()<<n<<endl;});
timer->start(1000);
}
void Widget::on_pushButton_clicked()
{
qDebug()<<n<<endl;
}
如上,我对于定时器跳到n为3的时候就停下来,然后按按钮,查看当前的n的值,发现类中属性n为3。
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); n = 0;
qDebug()<<[=](int n1)mutable {n += 3;return n1+n;}(3)<<endl; //6
qDebug()<<n<<endl; //3 }
如果n为局部变量的话:
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this); int n = 0;
qDebug()<<[=](int n1)mutable {n += 3;return n1+n;}(3)<<endl; //6
qDebug()<<n<<endl; //0 }
Qt中使用匿名函数lambda表达式的更多相关文章
- 【Unity|C#】基础篇(9)——匿名函数 / Lambda表达式
[学习资料] <C#图解教程>(第13章):https://www.cnblogs.com/moonache/p/7687551.html 电子书下载:https://pan.baidu. ...
- Python中的匿名函数lambda的用法
一.lambda函数的简介 对lambda函数,它其实是一个类似于def的函数,只不过lambda是一个不需要定义函数名的匿名函数.当我们在有些时候,需要做一些简单的数学计算时,如果定义一个def函 ...
- 匿名函数 lambda表达式(lambda expression)
阅读g2log时,发现有两行代码居然看不懂. 1. auto bg_call = [this, log_directory]() {return pimpl_->backgroundChang ...
- (28)C#委托,匿名函数,lambda表达式,事件
一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...
- Python匿名函数——lambda表达式
如果要定义的函数很简单,一个return语句就能搞定,可以使用lambda表达式来定义, lambda表达式的语法如下: lambda parameters: expression lambda表达式 ...
- 【C#】委托中的匿名函数与lambda
将方法作为方法的参数 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使 ...
- python做中学(八)匿名函数lambda的用法
匿名函数,顾名思义即没有名称的函数,和def定义的函数的最大区别在于匿名函数创建后返回函数本身(即匿名函数不需要return来返回值),表达式本身结果就是返回值,而def创建后则赋值给一个变量名,在P ...
- 匿名函数(lambda)在列表生成式和生成器中的应用示例
匿名函数(lambda)在列表生成式和生成器中的应用示例 列表生成式中实例 先看题: 以下代码的输出是什么?请给出答案并解释: def func(): return [lambda x: x * i ...
- 匿名函数 =匿名方法+ lambda 表达式
匿名函数的定义和用途 匿名函数是一个"内联"语句或表达式,可在需要委托类型的任何地方使用. 可以使用匿名函数来初始化命名委托[无需取名字的委托],或传递命名委托(而不是命名委托类型 ...
随机推荐
- python微信服务号关注授权、消息推送流程
阅读目录 推送的方式: 微信推送的流程: 流程分析: 给用户推送消息功能 推送的方式: 短信推送(第三方) 邮件推送 微信推送 公众号:认证的公众号(个人的认证公众号每天只能发一篇文章),粉丝可以跟公 ...
- Python学习路线图(2020年最新版)
这是我刚开始学习python时的一套学习路线,从入门到上手.(不敢说精通,哈哈~) 希望对大家有帮助哈~ 一.Python入门.环境搭建.变量.数据类型 二.Python运算符.条件结构.循环结构 三 ...
- linux中查看磁盘容量的常用操作
linux中查看磁盘容量常用操作 实验室有GPU集群,用户跑数据时候跑着跑着会出现集群挂掉的问题,原因就是,在跑数据时,用户上传文件,数据集,系统产生缓存等一系列操作,消耗了集群空间,师兄让我清理下服 ...
- 用户字符串操作,这里面包括字符串的decode、encode、substract等等操作
工具类描述:用户字符串操作,这里面包括字符串的decode.encode.substract等等操作 package cn.hgnulb; import java.io.UnsupportedEnco ...
- java - redis学习
在学习redis之前,我们首先需要了解一下NoSQL(非关系数据库).非关系型数据库通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定. 为什么需要NoSQL? (1) ...
- java输入输出 -- Java NIO之套接字通道
一.简介 前面一篇文章讲了文件通道,本文继续来说说另一种类型的通道 – 套接字通道.在展开说明之前,咱们先来聊聊套接字的由来.套接字即 socket,最早由伯克利大学的研究人员开发,所以经常被称为Be ...
- 注册中心Eureka 说明
Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的.SpringCloud将它集成在其子项 ...
- MongoDB查询操作
按条件查询 比较操作:$lt,$lte,$gt,$gte,$ne db.user.find({}}); $or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反 db.user.find ...
- CentOS7 服务器连接超时自动断开问题解决
背景 现在的客户们都开始使用云服务器了,还要通过堡垒机才给访问权限,这种方式访问方式以前都是银行的"专利",不过也间接说明其他行业的信息化也越来越普及了.今天主要是因为分配给我的这 ...
- hdu 1114需要装满的完全背包 重点是背包初始化的问题
.,. 最近在看背包九讲 所以就刷了一下背包的题目 这道题目是一个典型的完全背包问题 而且要求满包 在这里 我就简单整理一下背包初始化问题吧 对于没有要求满包的问题 也就是背包可以不取满的问题 在背包 ...