介绍
从C++11开始引入了lambda表达式,结合其他语言的定义,Lambda表达式,也被称之为匿名函数,可以实现类似的函数的功能,实现函数式编程的概念,是现代编程语言的特点之一,可以与操作符重载括号得到的伪函数关联记忆。具体的定义方法如下。既然是对象自然也就可以new
出来内存空间(区分Java,可不是对象😂)
1
| auto 对象名 = [捕获列表](参数列表){函数体};
|
说说λ
从一段简单的代码说起,根据面向对象的概念lambda表达式也是一种对象,它的类型是auto
,所以它的语法要这么写。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <iostream> using namespace std;
int main() { auto lambda = []() { cout << "hello world" << endl; }; lambda(); }
控制台输出: hello world
|
含参类型的lambda可以通过仿函数的写法调用,具体实现可以用操作符重载实现,这里简单写一写
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <iostream> using namespace std;
int main() { auto lambda = [](int a,int b) { cout << "结果为:" << a+b << endl; }; lambda(1,2); }
控制台输出: 3
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <iostream> using namespace std;
class lambda { public: lambda(int a,int b) { this->a = a; this->b = b; } void operator()() { cout << "加和为:" << this->a+this->b << endl; } private: int a; int b; }; int main() { lambda m(2,3); m(); }
|
既然lambda可以无名使用,auto
的存在也就没那么重要了,也就是可以省略。而表达式内需要用到参数的就要在小括号内加入参数,方括号内的是执行捕获列表,常用的有&
引用捕获、=
复制捕获、this
指针捕获。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| #include <iostream> using namespace std;
int main() { int x = 1; int y = 2; auto lambda1 = []() { cout << "空捕获" << endl; }; auto lambda2 = [=]() { cout << "=捕获" << x << y << endl; }; auto lambda3 = [&]() { cout << "&捕获" << x << y << endl; }; auto lambda4 = [&x]() { cout << "&x捕获" << x << endl; }; auto lambda5 = [&y]() { cout << "&y捕获" << y << endl; }; auto lambda6 = [x,y]() { cout << "x,y捕获" << x << y << endl; }; auto lambda7 = [&x,y]() { cout << "&x,y捕获" << x << y << endl; }; auto lambda8 = [x, &y]() { cout << "x,&y捕获" << x << y << endl; }; lambda1(); lambda2(); lambda3(); lambda4(); lambda5(); lambda6(); lambda7(); lambda8(); }
输出控制台: 空捕获 =捕获12 &捕获12 &x捕获1 &y捕获2 x,y捕获12 &x,y捕获12 x,&y捕获12
|
方括号内的格式,决定了匿名函数外部的变量是否可以被函数内部访问到,留空意味什么都不捕获,=
就是复制一份访问不可修改,&
就是引用变量可以修改。
在多线程中,也可以使用lambda创建线程,写法简便
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <iostream> #include <Thread> using namespace std;
int main() { thread thread1([] { cout << "thread1" << endl; }); thread1.join(); }
thread1
|
结束