c++匿名函数考察点

一般的函数形式以及调用形式

int foo(int a,int b)
{
	return a + b;
}

foo(1,2)

首先是匿名函数形式
[]//捕获列表 默认是按值捕获
()//参数列表
->int //函数返回值

int c2 = [](int a, int b) -> int
	{
		return a + b;
	}(1,2);

	//为了能够复用lamba表达式

	auto f= [](int a, int b) -> int
	{
		return a + b;
	};

	int c3 = f(1, 2);

嵌套的lamba表达式 (函数式编程)

	int c4=[](int n)
	{
		return [n](int x)
		{
			return n + x;
		}(2);
	}(1);

为了能够复用嵌套的lamba表达式
上面的式子等价于

auto f2= [](int n)
	{
		cout << "n=" << n << endl;
		return [n](int x)
		{
			cout <<"x="<<x << endl;
			return n + x;
		};
		
	};
	int c5 = f2(1)(2);

这里有一个常考点,捕获列表,默认是按值捕获,(内部修改不会影响外部)
mutable是为了匿名函数t能够++t,不然报错t是右值,不能修改。

int t = 10;
	auto f3 = [t]()mutable->int
	{
		return ++t;
	};


	auto f4 = [t]()mutable->int
	{
		return ++t;
	};

	//我们发现其实每个同个匿名内部都是按  值  捕获 ,不会改变外部的值,但是每次调用f3 f3内部会维持同一个地址  f4内部也会维持一个地址  f3,f4变量互不影响。
	cout << f3() << endl;
	cout << f4() << endl;
	cout << f3() << endl;
	cout << f4() << endl;
	cout << t << endl;

上面充分说明了匿名内部是按 值 捕获,我们看看运行结果
在这里插入图片描述
我们发现其实每个同个匿名内部都是按 值 捕获 ,不会改变外部的值, f3内部会维持一个地址 f4内部也会维持一个地址 f3,f4变量互不影响。也就是外部t,f3中的t,f4中的t有各自的一个t地址

其实我们可以看看,t在外部地址,内部f3地质 ,内部f4地址
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210127114831194.png?x-oss-process=image/watermark,type_Z在这里插入图片描述
mFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzIzOTIzNzEz,size_16,color_FFFFFF,t_70)

当然我们也可以按引用捕获

	//更一般的
	t = 100;
	//按值捕获
	auto f5 = [t]()->int
	{
		cout << t << endl;
	};
	

	auto f6 = [&t]()->int
	{
		t = t + 15;
		cout << t << endl; 
		return t;
	};
	cout << f6()<< endl;//外部的t是没有改变的



//捕获列表
	int m = 1;
	int n = 2;

	//外面的参数都是按值捕获
	[=]()
	{
		cout << m << " " << n << endl;
	};


	//外面的参数都是按引用捕获
	[&]()
	{
		cout << ++m << " " << ++n << endl;
	};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
匿名函数指针是指没有具体名称的函数指针。在C语言中,我们可以使用函数指针来存储和传递函数的地址。而匿名函数指针则是没有被命名的函数指针。 通常情况下,我们需要先定义一个函数,然后再通过函数名来获取函数的地址,进而赋值给函数指针变量。但是有些情况下,我们可能只需要临时地定义一个函数,并且不需要给它一个具体的名称,这时就可以使用匿名函数指针。 在C语言中,可以使用函数指针类型来声明匿名函数指针,然后通过函数指针类型定义一个匿名函数,并将其赋值给匿名函数指针变量。例如: ```c int (*anonymous_function_ptr)(int); // 声明匿名函数指针类型 anonymous_function_ptr = ^(int num) { return num * 2; // 定义匿名函数并赋值给匿名函数指针变量 }; int result = anonymous_function_ptr(5); // 调用匿名函数指针所指向的匿名函数 ``` 在上述例子中,首先声明了一个匿名函数指针类型 `int (*)(int)`,然后定义了一个匿名函数并将其赋值给 `anonymous_function_ptr`。最后通过 `anonymous_function_ptr(5)` 调用了该匿名函数,并将结果赋值给 `result`。 需要注意的是,匿名函数指针在C语言中并不是原生支持的特性,上述例子中使用的是一种类似于匿名函数指针的实现方式。在实际开发中,若需要使用匿名函数指针,可以根据具体需求自行实现或使用相关的第三方库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值