C++的使用小教程3——Lambda 函数与表达式
lambda表达式可以用于简洁的表达一个函数,虽然不太会用,但是之后看代码的时候可能会遇见,还是学习一下为妙。
1、什么是Lambda函数
C++11提供了对匿名函数的支持,匿名函数被称为 Lambda 函数,也可以被称作Lambda表达式。
具体的形式如下:
[capture](parameters)mutable->return-type{body}
其中存在四个参数,分别是:
1、[capture] :capture是捕捉列表。捕捉列表是Lambda表达式的开头。
2、(parameters):parameters是参数列表。和C++中的普通函数参数意义一样。
3、mutable:当我们在参数列表后面注明了“mutable”关键字之后,可以取消其const常量的性质。
4、->return-type:return-type是函数的返回值类型。和C/C++中的普通函数返回值类型的性质一样。当不需要返回值时,可以去掉这一部分。
5、 {statement}:statement是函数体。是函数的具体执行过程。
2、简单Lambda函数使用示例
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 10;
auto sum = [](int p1, int p2)mutable->int{return (p1 + p2); };
cout << sum(a,b) <<'\n';
system("pause");
return 0;
}
结果为:
20
请按任意键继续. . .
3、捕捉列表
捕捉列表可以填入不同的值。
1、填入 = 时,代表通过值传递捕捉父作用域的变量
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 10;
auto fun1 = [=] {return a + b; }; //值传递捕捉父作用域变量
cout << fun1() <<'\n';
system("pause");
return 0;
}
输出为:
20
请按任意键继续. . .
2、填入 & 时,代表通过引用传递捕捉父作用域的变量
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 10;
auto fun2 = [&](int c) {b = a + c; a = 5; };
fun2(5);
cout << "a = " << a << " b = " << b << endl;
system("pause");
return 0;
}
结果为:
a = 5 b = 15
请按任意键继续. . .
3、填入[ = , &b ]时,代表除去b外,其他值以值传递的方式捕捉
以值传递捕捉的变量,在函数体里如果要修改,要加mutaple,因为默认使用const修饰。
在本例中,a变量以值传递的方式捕捉,需要加上mutable才可以修改,否则会报错。
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int b = 10;
auto fun3 = [=, &b](int c)mutable { b = a + c; a = 5; }; //以值传递捕捉的变量,在函数体里如果要修改,要加mutaple,因为默认const修饰
fun3(3);
cout << "a = " << a << " b = " << b << endl;
system("pause");
return 0;
}
结果为:
a = 10 b = 15
请按任意键继续. . .