C++11初识(基本面试题)

初识c++11(面试基本) lambda函数*

文章目录

    • *初识c++11(面试基本) lambda函数**
  • 前言
  • 一、lambda基本组成
  • 二、捕获参数部分
    • 1.值捕获
    • 2.引用捕获
    • 3.隐式捕获
    • 4.混合方式捕获
  • 三、修改捕获参数以及参数的类型
    • 1.怎么修改捕获变量
    • 2.关于lambda中的参数


前言

本文主要是简单介绍lambda的基本组成以及各部分用法,有错误请见谅,我会及时改正。

一、lambda基本组成

c++11:lambda
lambda:利用Lambda表达式,可以方便的定义和创建匿名函数
一般格式:[a] (b)c d ->return type {e}
a:捕捉外部变量,b:函数体中所利用到的lambda本身的参数
c:说明是否可以修改捕获的变量 d:异常设定 e:函数体
一般不会用的这么完整可以省略很多比如:
1:[a] (b)->return typr{e}
2:[a] (b){e}
3:[a]{e}
对于格式1可能声明了const所以cd可以省略因为无法修改捕获值
格式二 省略返回类型
1:在e也就是结果体中有return则以那个为返回类型
2:没有return 也就是默认为void}
格式三中:省略参数也就是只有捕获。
关于捕获变量:在方括号中声明捕获的变量,必须明确声明那些变量可以被lambda使用。

二、捕获参数部分

1.值捕获

值捕获:就是只捕获值,后来对于这个参数的改变不会影响到lambda表达式中的值

int main()
{
    int a = 12;
    auto f = [a] { cout << a << endl; }; //此处并不会输出
    a = 321;
    f(); // 输出:123
}

`

2.引用捕获

引用捕获:类似于引用就是外部修改会影响到lambda中的值,参数前边必须加&。
代码如下(示例):

void main()
{
	int a = 55553;
	auto f = [&a](){cout << a << endl;};
	a = 566;
	f();
}

3.隐式捕获

上面的值捕获和引用捕获都需要我们在捕获列表中显示列出Lambda表达式中使用的外部变量。除此之外,我们还可以让编译器根据函数体中的代码来推断需要捕获哪些变量,这种方式称之为隐式捕获。隐式捕获有两种方式,分别是[=]和[&]。[=]表示以值捕获的方式捕获外部变量,[&]表示以引用捕获的方式捕获外部变量。

隐式值捕获示例:
int main()
{
    int a = 123;
    auto f = [=] { cout << a << endl; };    // 值捕获
    f(); // 输出:123
}

4.混合方式捕获

其他捕获方式:

[] 不捕获任何外部变量
[变量名, …] 默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)
[this] 以值的形式捕获this指针
[=] 以值的形式捕获所有外部变量
[&] 以引用形式捕获所有外部变量
[=, &x] 变量x以引用形式捕获,其余变量以传值形式捕获
[&, x] 变量x以值的形式捕获,其余变量以引用形式捕获

三、修改捕获参数以及参数的类型

1.怎么修改捕获变量

怎么去修改捕获变量,如果是const那就无法修改,如果要修改那就必须,把基本表达式中的c部分修改为mutable关键词,并且在结构体中修改捕获的变量,其中需要注意加上mutable修改的不是值本身,而只是修改拷贝,我自我理解为修改的是值传递进来的而不是引用传递。

void main()
{
	int a = 123;
	auto f = [a]()mutable{cout <<++a;};
	cout <<a << endl;//输出123
	f();//输出124
}

2.关于lambda中的参数

lambda中的参数:也就是b部分的参数
参数不能有默认参数,也就是参数不能有默认值
2.不支持可变参数,这个不多说就是不可以改变
① 参数不能有缺省值 如:int Add1(int a, int b=10)
② 不能有可变长参数列表 如:int Add2(int count, ...)
③ 不能有无名参数 如:int Add3 (int a, int b, int) // 第三个参数为无名参数,用于以后扩展

你可能感兴趣的:(面试基础,c++,面试,lambda,后端)