回答

收藏

C++ Lambda表达式详解(C++ lambda表达式详解)

知识点 知识点 44 人阅读 | 0 人回复 | 2023-02-02

帖子摘要:1、Lambda表达式 C 11中的Lambda表达式用于定义并创建匿名的函数对象以简化编程工作。 Lambda的语法形式如下 [函数对象参数](操作符重载函数参数) mutable或exceptio......" P& Y1 x! X) r

/ _% a) ]% p! C* W) Q! j$ i大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“C++ Lambda表达式详解”
0 d/ f) M. }% k
- t3 \1 n. J% e9 U( R
) _/ Z) f+ ]! E: n  z
        
7 J- \' U. R- a9 N6 v9 H1 m' A               
; c3 q- M# f; t- q% B                    1、Lambda表达式
, F7 D9 r' E. [% t% uC++ 11中的Lambda表达式用于定义并创建匿名的函数对象以简化编程工作。! K  w( _3 ]* G
+ ^4 F$ J7 y+ S8 d' c) j
Lambda的语法形式如下
6 Y; a$ p$ g, g
6 t1 |' L: |7 W1 B[函数对象参数](操作符重载函数参数) mutable或exception声明->返回值类型{ 函数体 }
" @( l/ u# q7 q7 i9 I
0 n/ u$ p$ V% _) {7 |可以看到Lambda主要分为五个部分- A1 Y  G1 b' B, I) c

  g  V1 q6 R; d/ Z$ L. r0 X% j[函数对象参数]、(操作符重载函数参数)、mutable或exception声明、->返回值类型、{ 函数体 }。1 J- \+ R; m8 \/ M+ @; q3 {
6 B* @$ e' p  J) B5 \
具体如下! e8 X' X& m. _
+ ]5 i1 ~* d; Z; p$ b! G
一、[函数对象参数]标识一个Lambda的开始这部分必须存在不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。0 [) h3 |) c* I6 ^3 W5 Z: F& y' L, \
5 A7 l! }, @5 ?1 U9 m
函数对象参数只能使用那些到定义Lambda为止时Lambda所在作用范围内可见的局部变量包括Lambda所在类的this。
1 x& z5 Z: Y6 n  k6 \2 q# | 0 p! j4 d. M) t7 }+ T  c# @
函数对象参数有以下形式
# f0 l: L" [2 ]. b, ^ 4 ?7 _. C! M6 E! K
1、空。没有使用任何函数对象参数。- G/ H7 r) ?" K3 ~+ n0 J1 t+ Y

4 S% ?" |; y# p2 M1 R2、 = 。函数体内可以使用Lambda所在作用范围内所有可见的局部变量包括Lambda所在类的this并且是值传递方式相当于编译器自动为我们按值传递了所有局部变量。+ l% n' @" K# m0 Y
- K! ]; C: U3 R6 ~
3、&。函数体内可以使用Lambda所在作用范围内所有可见的局部变量包括Lambda所在类的this并且是引用传递方式相当于编译器自动为我们按引用传递了所有局部变量。9 D7 p0 K' f8 @4 J
3 ~" E5 n! A' j
4、this。函数体内可以使用Lambda所在类中的成员变量。+ N2 M+ E/ x; V! E* a

* q% s1 T; y/ L. S; M. X1 `- V5、a。将a按值进行传递。按值进行传递时函数体内不能修改传递进来的a的拷贝因为默认情况下函数是const的。要修改传递进来的a的拷贝可以添加mutable修饰符。
" b4 f/ M8 M6 Q* F& ^# V: x+ N8 R
7 G) s1 `  v9 M2 t% t5 n6 [: B6、&a。将a按引用进行传递修复修改a。
( Q1 _+ Q; f7 T; J' {0 d* D/ w
" a* z! G* g% i5 I# _* f, ^7、a, &b。将a按值进行传递b按引用进行传递。1 A2 d2 j8 s) `
* z1 p. }) H' l2 V& g
8、 = &a, &b。除a和b按引用进行传递外其他参数都按值进行传递。/ K' I  v3 \, I7 ~7 T) i
2 t9 u, y1 |( K: `7 T2 D4 Y& q8 _
9、&, a, b。除a和b按值进行传递外其他参数都按引用进行传递。
* j: Q. j  X4 d) J1 K
1 P( H* E* h" u; x' K( b二、(操作符重载函数参数)标识重载的()操作符的参数没有参数时这部分可以省略。参数可以通过按值如(a, b)和按引用如(&a, &b)两种方式进行传递。
4 q3 K+ U* Q$ G. A- ~$ n4 T/ S 5 y2 j; A1 R& K3 i7 J
三、mutable或exception声明这部分可以省略。按值传递函数对象参数时加上mutable修饰符后可以修改按值传递进来的拷贝注意是能修改拷贝而不是值本身。
1 G2 b0 w- o/ d3 K. B& t
4 m1 M+ `2 m2 g0 R  M' b1 ^6 wexception声明用于指定函数抛出的异常如抛出整数类型的异常可以使用throw(int)。5 e. U: y2 N' Y4 C  C3 w  }3 I! b
# r% T! k% k. l' B. q
四、->返回值类型标识函数返回值的类型当返回值为void或者函数体中只有一处return的地方此时编译器可以自动推断出返回值类型时这部分可以省略。( K5 w& j. w1 D6 X9 H' [

4 M2 h  }8 ~, D2 x五、{ 函数体 }标识函数的实现这部分不能省略但函数体可以为空。+ b, P3 i" }" K. y7 X, s
$ C$ f3 G# F7 \( E. L7 J
2、示例 % n' d, X5 r, u( A
1简单示例* n8 R% E0 f: W

* m! G  {* [' N" w& X' l& N) o
  1. #include " P: Y' n- y9 [" B# e" l2 B
  2. #include[i] " o. f5 b5 Z" l0 J
  3. #include
  4. #include 3 x2 A4 m  W( i" X9 p, S
  5. using namespace std;
  6. void test01()
  7. { ' N2 a* }: n1 K" l* o& Y
  8.         auto func1 = []() {cout  
  9. 2for_each示例
  10. [code]void test02() : M* l% Z, I  B
  11. {
  12.         vector[i] v_test;
  13.         v_test.push_back(10);
  14.         v_test.push_back(20);
  15.         v_test.push_back(30); 8 b8 Z8 R" S; u1 Q& N7 B, W; Z3 u- u4 w# t
  16.         for_each(v_test.begin(), v_test.end(), [](int v) {cout  
  17. 3“=”示例 * E# k+ D# d: D
  18. * p9 d4 X' u. c; D( S+ Z6 i8 }1 V1 [
  19. [code]void test03()
  20. { / {$ y  W8 _* _# w1 N6 U% ]$ e. `
  21.         vector[i] v_test; + G/ a% {/ o7 N6 I% f/ j- N+ D
  22.         v_test.push_back(10);
  23.         v_test.push_back(20); , {. L- ]2 S% [+ W6 ^6 O/ ^& ?
  24.         v_test.push_back(30); ! z; a# D5 b! f- h2 c7 ]8 u, q
  25.         int a = 10; $ g: t' o( i1 H
  26.         // "=" 知道a的存在可以引用,只能读不可以写,引用当前块语句内部的局部变量 9 ?" x9 K) o8 [, }7 w' G. D
  27.         auto func1 = [=](int v) { v += a; cout   ( w; k( \5 L& }
  28. 4&引用变量示例
  29. [code]void test04()
  30. {
  31.         vector[i] v_test; ( L  i6 J; p6 j1 i0 ~' O& v
  32.         v_test.push_back(10); 7 s  O* s5 q# w% j" x: |
  33.         v_test.push_back(20);
  34.         v_test.push_back(30);
  35.         int a = 10;
  36.         // 引用变量a
  37.         auto func1 = [&a](int v) { a = 3; v += a; cout   ( U: ^( i! Y& f- G- v  Q2 E
  38. 5lambda结构意义 1 n- t. N4 }4 I6 k+ S
  39.   X& Y5 N/ c; @# C1 o
  40. [code]void test05()
  41. {
  42.         []() { cout   - I8 l6 P+ R; b" `3 y1 @( z; R
  43. 6类中lambda示例
  44. [code]class Test
  45. { 0 @- e4 N# z4 Y3 T- ]- M) G
  46. public:
  47.         Test() {
  48.                 num_ = 40; . A6 l, _/ r" C! E( ~8 C$ q9 @
  49.                 v_test_.push_back(10); ( E8 c& h. ^: {: r+ ~! X
  50.                 v_test_.push_back(20); 6 {9 N$ q- V: n5 z5 q3 G
  51.         }   v+ |; J1 ^/ E1 j
  52.         void Add()
  53.         {   V" A  _' K$ @+ }) Y7 k4 ?# ~
  54.                 // []引用this ) x( V. N* ~) N7 W3 x7 X4 J4 M* k
  55.                 int x = 3;
  56.                 auto func1 = [this, x](int v) { cout num_ num_ v_test_.begin(), this->v_test_.end(), func2); ( K0 P- {: k7 W" m+ v- D
  57.         }
  58. public: # `& a  T; u0 @
  59.         vector[i] v_test_;
  60.         int num_;
  61. };
复制代码
9 }; n& R/ ~  V, k
/ y* U" y) ?- y( e/ I  W- ?
本文来源csdn,由Java吧转载发布,观点不代表Java吧的立场,转载请标明来源出处:https://www.java8.com
分享到:
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

27565 积分
7055 主题
热门推荐