QT学习笔记之Lambda表达式

QT学习教程
重点:Lambda表达式
含义:lambda表达式是定义匿名函数对象的便捷方法,直接在调用或作为参数传递的函数位置.
表达式示例: [=] ( ) mutable throw( ) -> int { }
1 2 3 4 5 6
由6个部分组成
1.capture子句(C++规范中也称为lambda引入器).
详细说明:
捕获外部变量列表 = 是以传值的方式引用 & 是以引用的方式引用.
值捕获:[a]{cout << a << endl}
引用捕获:
int a = 123;
[&a]{cout << a << endl};
a = 321;
输出结果a:321
隐式捕获:编译器根据函数体中的代码来推断需要捕获哪些变量.
[=] 表示以值捕获的方式捕获外部变量
[&] 表示以引用捕获的方式捕获外部变量
混合方式:
[] 不捕获任何外部变量
[变量名,...] 默认以值的形式捕获指定的多个外部变量,如果引用捕获需要使用&说明
[this] 以值的形式捕获this指针
[=] 以值的形式捕获所有外部变量
[&] 以引用的形式捕获所有外部变量
[=, &x] 变量x以引用的形式捕获,其余变量以传值的形式捕获
[&, x] 变量x以值的形式捕获,其余变量以引用的形式捕获
2.参数列表(可选).(也称作为lambda声明符)
3.可变规范(可选).用来说名是否可以修改捕获的变量,const.
4.exception-specification(可选). 异常设定
5.trailing-return-type(可选). 返回类型
6.lambda正文. 函数体
关于lambda表达式的程讲解自己的一些理解
1.这种[](){}状态仅仅是声明了一个lambda表达式,想要调用的话需要在函数体后加().调用示例:[](){}().
2.修饰符的问题[m]() mutable {} 加上修饰符mutable才能够在函数体中对拷贝过来的m做修改否则会报错.
问题:
在信号和槽连接时使用lambda表达式
QString str = "你好";
connect(btn, &QPushButton::clicked, [this](QString str){}(str));
这个参数 QString str 怎么用?
答案:
通过群内问问题,看老哥们的意思
在信号和槽的连接函数中我是将lambda表达式以一个参数传入连接函数.
lambda相当于一个槽函数,看编译器报错信息也遵循了信号函数的参数个数必须大于或等于槽函数形参.
实验了一下是的,lambda表达式就是槽函数,表达式形参的使用取决于信号当中相对应的参数

posted @ 2022-06-07 13:53  追梦人(菜鸟)  阅读(1019)  评论(0)    收藏  举报