C++学习--Lambda表达式

Lambda的形式是[函数对象参数](操作符重载函数参数)某种声明(例如:mutable)->返回值类型{函数体};

Lambda的调用方式有两种,一种是直接在整个Lambda表达式后面带上(),因为Lambda表达式就是函数指针,函数指针带上()就是调用,另一种是起一个别名,即使把Lambda赋值给一个变量名,通过变量名+()进行调用。

直接看它的定义时非常难懂的,简单来说[ ]里的是你可以在Lambda表达式中使用的参数,例如:你在类中使用Lambda表达式,想在Lambda中使用类的变量(包括this指针)那么你可以通过[ ]给Lambda传递。

1.空:Lambda表达式不使用在同一块语句的变量,例如:[]
2.=:在块语句内的局部变量都以值传递的方式传递给Lambda,例如:[=]
3.&:块语句内的局部变量以引用方式传递给Lambda,例如:[&]
4.指定某个变量传递,例如:[a],[&a]

注意:

值传递的方式在Lambda不能对变量做出修改,例如:[a](){函数体};在函数体中,只能访问变量a,不能对变量a做出修改。想要修改a的值可以用引用的方式传递[&a];也可以声明为mutable,例如:[a]()mutable{函数体};那么在{函数体}中可以修改a的值,但这个a是函数体的副本,不是外部的a。

#include<iostream>
#include<functional>
#include<stdlib.h>
using namespace std;
void main()
{
	int a = 10;
	auto f=[a]()mutable{
		a++;
		cout << a << endl; 
	};//值传递
	f();//调用Lambda
	cout << a << endl;
	auto f2 = [&a](){
		a++;
	};//引用
	f2();//调用Lambda
	cout << a << endl;
	system("pause");
}

由打印结果可以区分mutable[&]的区别。

参数:

Lambda接收参数,参数用()传递,例如:

[ ](int a,int b){函数体};

#include<iostream>
#include<functional>
#include<stdlib.h>
using namespace std;
void main()
{
	int a(10), b(20);
	auto add=[](int a, int b){
		cout << a + b << endl; 
	};
	add(a, b);//传参
	system("pause");
}

指定返回值类型:

Lambda表达式中{函数体}若有返回值,可以通过->返回值类型指定,例如:

#include<iostream>
#include<stdlib.h>
#include<functional>
using namespace std;
void main()
{
	int a(10), b(20);
	auto add=[](int a, int b)->int{//指定返回值类型
		return a + b;
	};
	cout<<add(a, b)<<endl;
	system("pause");
}

猜你喜欢

转载自blog.csdn.net/weixin_40850689/article/details/84782524