赞
踩
目录
2.2 [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
在 C++ 11 标准中引入 lambda 表达式,用于定义创建匿名函数的对象。
在需要的时间和地点实现功能的闭包,方便快捷。
表达式定义类型:
[函数定义参数](函数参数)修饰符 -> 返回值类型{函数体; };
- auto f = [](int num) -> int {return num + 3; };
- auto numB = [](int num) -> int {return num + 10; };
例如:
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
- auto f = [](int num) -> int {return num + 3; };
- cout << f(5) << endl;
- return 0;
- }
- #include <iostream>
-
- using namespace std;
-
- // 定义全局变量
- static int globalVarA = 20;
-
- int main()
- {
- // [] 不捕获任何变量
- // 全局变量可以在lambda函数体中使用
- auto f = [](int num) -> int {return num + 3; };
- auto numB = [](int num) -> int {return globalVarA + num; };
- cout << f(5) << "\n" << numB(10) << endl;
- return 0;
- }
按引用使用。
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
- // [&] 捕获外部作用域中所有变量,并作为引用在函数体中使用
- int fanA = 100;
-
- // 在函数体中可以使用修改 fanA
- auto numC = [&](int num) -> int {fanA = 200; return fanA + num; };
- cout << numC(20) << "\n" << "fanA = " << fanA <<endl;
-
- }
按值捕获。
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
- // [=] 捕获外部所有变量,并作为副本在函数中使用
- // 按值捕获
- int numA = 1000;
-
- // 在lambda函数体中不能操作 numA,例如numA++ 或 numA = 2000。
- auto f = [=](int num) -> int {return numA + num; };
- cout << "numA = " << numA << "\n" << f(1000) << endl;
-
- }
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
- // = & 混合使用
- int numA = 100;
- int numC = 200;
-
- // 在lambda表达式函数体中,= 表示可以使用外部作用域所有变量,&numA 表示可以修改其值,其余不可以修改。
- auto f = [=, &numA](int num) -> int {numA++; return num + numA + numC; };
- cout << numA << endl << numC << endl << f(100) << endl;
-
- return 0;
- }
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
-
- // 按变量捕获
- int numA = 1000;
-
- auto f = [numA]() -> int {return numA; };
- cout << f() << endl;
-
- return 0;
- }
- int numA = 100;
- auto f1 = [numA]() -> void {numA++;cout << numA << endl; };
- f1();
使用参数值传递的时候,在 lambda 函数体内部不可以修改其值。
mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。
- #include <iostream>
-
- using namespace std;
-
- int main()
- {
- // 修饰符
- // mutable: 使用参数值传递的时候,在lambda函数体内部不可以修改其值,可以通过添加修饰符mutable。
- int numA = 100;
-
- auto f2 = [numA]() mutable {numA++; cout << numA << endl; };
- f2();
-
- return 0;
- }
exception:exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。