lambda表达式
定义了一个匿名函数,可以捕获一定范围的变量在函数内部使用
1.函数指针:
#include <iostream>
using namespace std;
//函数指针
void fun(){
cout<<"nihao"<<endl;
}
int fun0(int a)
{
cout<<a<<endl;
return 1;
}
int main()
{
//c++中的函数指针
void (*p) ();
//指针p指向一个函数,指针p的类型是函数返回值的类型,()里面代表的是函数参数的类型
p=fun;
p();
int (*q) (int);
q=fun0;
q(1);
return 0;
}
2.lambda表达式语法:
auto fun=[传的值](参数)->强制返回值类型{函数体};
int main()
{
//[](){};
//lambda表达式,匿名函数,即不需要函数的名字
//[]是lambda表达式的标志,
//()小括号里面是lambda表达式的参数列表,大括号里面是函数体
//{}里面是函数体
[](int a,int b){
cout<<"这是lambda表达式!,a,b的值为:"<<a<<" "<<b<<endl;
}(111,222);//这里的()里面就是给参数赋值
return 0;
}
lambda表达式也是一个对象,可以赋值。
//对lambda表达式进行赋值,变量fun就成为为一个函数。
auto fun=[](int a){
cout<<"这是lambda表达式!,a的值为:"<<a<<endl;
};
fun(111);//调用这个函数。
lambda表达式指定返回值类型
//强制指定返回值的类型
auto fun2=[](int a)->double{
cout<<"a的值为:"<<2<<endl;
return a;
};
fun2(2);
cout<<typeid(fun2(2)).name()<<endl;
3.传值
#include <bits/stdc++.h>
using namespace std;
int main()
{
int x=1;
int y=2;
//要在lambda表达式里面输出x,y的值;
// 1.参数传入,这种情况下在lambda表达式函数体内部对x,y的值进行修改不会改变外面的x,y;
auto fun1=[](int x,int y){
x+=1;
cout<<x<<" "<<y<<endl;
};
fun1(x,y);
[](int x,int y){
cout<<x<<" "<<y<<endl;
}(x,y);
cout<<"--------"<<endl;
// 2.[]传入,在lambda表达式函数体内部不能对x,y进行修改
[x,y](){
cout<<x<<" "<<y<<endl;
}();
auto fun2=[x,y](){
cout<<x<<" "<<y<<endl;
};
fun2();
cout<<x<<endl;
cout<<"--------"<<endl;
//3.[]里面使用引用传入,可以改变x,y的值。
auto fun3=[&x,&y](){
cout<<x<<" "<<y<<endl;
x+=1;y+=2;
};
fun3();
cout<<x<<" "<<y<<endl;
cout<<"--------"<<endl;
//4.[]传数规则
// [=] 值传递,表示在lambda表达式函数体外的变量,都可以访问
// [&] 引用传递 表示在lambda表达式函数体外的变量,可以访问和修改
// [=,&y] 表示,在lambda表达式函数体外的变量除了y可以进行修改,其他的变量只能进行访问,不能进行修改
// [&,y] 表示,在lambda表达式函数体外的变量除了y不能修改,其他的都能进行修改
//
//5.[]传入一个值,要求只在函数体里面进行修改,在函数体外部不变,使用mutable
int z=3;
//不加mutable会报错
// auto fun5=[z]() {
// cout<<z<<endl;
// z+=3;
// };
// fun5();
auto fun5=[z]()mutable {
cout<<z<<" ";
z+=3;
cout<<z<<endl;
};
fun5();
cout<<z<<endl;
return 0;
}
运行结果: