C++:闭包:闭包Closure理解

news2024/9/21 10:34:58

一:什么是闭包

闭包有很多定义,一种说法是:闭包是带有上下文的函数,说白了,就是有状态的函数,这其实就是一个类,换个名字而已。

一个函数,带上一个状态,就变成了闭包,那什么叫“带上状态”? 意思就是这个闭包有属于自己的变量,这些变量的值是创建闭包的时候设置的,并在调用闭包的时候,可以访问这些变量。

函数是代码,状态是一组变量,将代码和变量捆绑(bind),就形成了闭包。

二:闭包的实现 

2.1:重载operator()

因为闭包是一个函数加一个状态,这个状态通过隐含的 this指针传入,所以闭包必然是一个函数对象,因为成员变量就是极好的保存状态的工具,因此实现 operator()运算符重载,该类对象就能作为闭包使用。默认传入的 this指针提供了 访问成员变量的 途径。

/**
	闭包的使用
*/

#include<iostream>
#include<string>
using namespace std;

class MyFunctor
{
public:
	// 通过列表的形式初始化成员变量
	MyFunctor(int temp) :count(temp) {};

	// 重载operator()操作符
	int operator()(int temp) {
		return temp + count;
	}

public:
	int count;

private:

};

int main() {
	int count = 1;
	// 调用构造函数给成员变量赋值
	MyFunctor f(count);
	cout << "result: " << f(1) << endl;
}

2.2:Lambda表达式

int main() {
	int count = 1;
	// lambda表达式
	auto f_lambda = [=](int f)->int
	{
		return f + count;
	};
	cout << "f_lambda result: " << f_lambda(1) << endl;
}

点评: 通常  function<int(int)> f = [ ] (int x) {return x};

通常这个叫闭包。

闭包 [ ]  中可以添加 = 或者 & 两个运算符,查过 cpp reference后,这个叫 capture(捕获),即使用闭包外的变量方式。我们讨论下这两个运算符:

2.2.1:[=]() {} :这是对闭包外变量进行const 引用的形式,即不允许修改闭包外的变量 。

int main() {

    int count = 1;

    auto f_lambda1 = [=](int i)->int
    {
		count = 2;   // error: 表达式必须是可修改的左值(因为capture捕获的是const引用形式)
		return i + count;
    };

}

2.2.2:[&] () {}  : 这是对闭包外变量进行引用的形式,可以修改闭包外的变量,并且保留为修改后的值

int main() {

    int count = 1;

    auto f_lambda1 = [&](int i)->int
    {
		count = 2;   
		return i + count;
    };
    cout<< f_lambda1(2)<< endl;
    
}

// 打印结果:4

2.3:lambda表达式 

标准库提供的bind是更加强大的语法糖,将手写需要很多代码的闭包,浓缩到一行 bind就可以搞定了

int func(int temp, int count) {
	return temp + count;
}

int main() {
	int count = 1;
	// 调用构造函数给成员变量赋值
	// MyFunctor f(count);
	// cout << "result: " << f(1) << endl;

	// lambda表达式
	/*auto f_lambda = [=](int f)->int
	{
		return f + count;
	};
	cout << "f_lambda result: " << f_lambda(1) << endl;*/

	// bind表达式
	function<int(int)> f_bind = bind(func, placeholders::_1, count);
	cout<< f_bind(3)<< endl;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

共享模型之管程(四)

1.wait/notify 1.1.为什么需要wait? 小故事: ①.假设多个用户(线程)都需要进入房间使用算盘(CPU)进行计算工作,但是为了保证计算过程中的安全,老王设计了一把锁(Synchronized),每次只允许一个用户(线程)拿到钥匙进入房间(成为Owner线程); ②.小南(线程)费了九牛二虎之力,抢…

【Docker】搭建Zookeeper集群

【Docker】搭建Zookeeper集群 下载镜像 docker pull zookeeper:3.5.8wy:study wy$ docker pull zookeeper:3.5.8 3.5.8: Pulling from library/zookeeperDigest: sha256:12af523731cbe390f5332d6c1e254f1d56c734a786910d5582653445a5cee299 Status: Downloaded newer image f…

Allegro174版本新功能介绍之动态铜皮对单独层面参数设置

Allegro174版本新功能介绍之动态铜皮对单独层面参数设置 Allegro升级到了174版本的时候,可以支持动态铜皮对单独的层面进行参数设置,如下图 具体操作如下 在低版本166以及172的时候,只有Global Dynamic Shape Parameter设置,如下图,只有全局的铜皮参数设置升级到了174时候…

WMS智能仓储管理系统源码 SpringMVC物流仓库管理系统源码

淘源码&#xff1a;国内知名的源码免费下载平台 需要源码学习可私信我。 系统介绍&#xff1a; 基于SpringMVCHibernatMinidao&#xff08;类Mybatis&#xff09;Easyui&#xff08;UI库&#xff09; Jquery Boostrap Ehcache Redis Ztree等基础架构开发的物流仓库管理系…

人脸识别:我是如何工作的?

任何自动人脸识别过程都必须考虑导致其复杂性的几个因素&#xff0c;因为人脸是一个动态实体&#xff0c;在多个因素的影响下不断变化&#xff0c;例如光照、姿势、年龄……这三个参数中的任何一个的变化都会导致同一个人的两幅图像之间的误差值大于不同个体的两幅图像之间的误…

分享136个PHP源码,总有一款适合您

PHP源码 分享136个PHP源码&#xff0c;总有一款适合您 136个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1A5sR357dh_SlS7pu33lW1Q?pwdkzgn 提取码&#xff1a;kzgn import os# 查找指定文件夹下所有相同名称的文件 def search_file(dirPath, fileName):dirs os…

红中私教-文件上传漏洞DVWA靶场实战(浅析)

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 首先呢&#xff0c;针对于文件上传漏洞 这个漏洞为什么存在&#xff1f;目的是什么&#xff1f;我们为什幺要攻击…

开发环境和测试环境共用Eureka

问题描述 在开发过程中会遇到一种情况&#xff0c;那就是只需要修改一个服务&#xff0c;但是这个服务依赖了其他的3个服务&#xff0c;导致开发人员在本地也要启动其他的3个服务&#xff0c;还要启动一个Eureka注册中心。问题显而易见&#xff0c;在依赖过多的情况下&#xf…

一种多维数据库的数据事务专利解读

什么是事务&#xff1f; 事务是数据库系统中的核心机制。我们要理解下事务概念&#xff1a;什么是事务呢&#xff1f;事务是并发控制的单位&#xff0c;是用户定义的一个操作序列。有四个特性(ACID)&#xff1a; 原子性(Atomicity)&#xff1a; 事务是数据库的逻辑工作单位&…

使用 VSCode 开发的必备插件,你都安装了吗?

0️⃣前言 VSCode是由微软研发的一款免费、开源的跨平台代码编辑器&#xff0c;目前是前端开发使用最多的一款软件开发工具。 因为每个开发者所接触项目、所有技术不同, 用到的插件不同, 但总有几个插件基本是必备的, 以下就给出一些插件推荐&#xff0c;希望能给大家一些参考。…

腾讯会议发布录屏工具“会记”,让云端视频协作随用随录、随享随看

随着云端协同成为新常态&#xff0c;企业和组织沟通的形式也在不断丰富。1月5日&#xff0c;腾讯会议发布云端录屏工具“会记”&#xff0c; 用户在腾讯会议中就能自由使用人像、屏幕、声音、窗口等多种组合方式进行录制&#xff0c;录制完成后视频将自动上传至云端&#xff0c…

Centos7.9安装WebLogic详细步骤

目录 一、weblogic下载 二、准备环境 三、创建用户和组 四、安装jdk 安装 五、安装WebLogic 1、使用root用户创建目录/opt/weblogic并授权 2.创建 oraInst.loc 文件 3、创建wls.rsp 响应文件 4、安装weblogic 5、静默创建域 六、启动weblogic 一、weblogic下载 直…

程序员面试中一面、二面、三面有什么区别?

很多公司面试都分一面、二面、三面甚至更多&#xff0c;大家可能会好奇&#xff0c;为什么要面这么多面&#xff0c;每一面又有啥区别呢&#xff1f; 首先我来回答下为什么要这么多面&#xff0c;最核心的是最后3点&#xff1a; 如果光是一个人面&#xff0c;担心会看走眼&…

解决IDEA中ctrl+shift+f快捷键搜索没反应的问题

文章目录0写在前面1 问题解决1.1 直接切换英文输入法1.2 win10 输入法1.3 搜狗输入法1.4 其他2 写在末尾0写在前面 今天想使用《在文件中查询》功能&#xff0c;使用ctrlshiftf进行搜索的时候&#xff0c;疯狂的按组合键一直没用。最后用手点的…… 原因是IDEA的快捷键与输入…

【 java 集合】List接口常用方法总结

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

五、条件构造器和常用接口

文章目录五、条件构造器和常用接口1、wapper介绍2、QueryWrapper2.1 例1&#xff1a;组装查询条件2.2 例2&#xff1a;组装排序条件2.3 例3&#xff1a;组装删除条件2.4 例4&#xff1a;条件的优先级2.5 例5&#xff1a;组装select子句2.6 例6&#xff1a;实现子查询3、UpdateW…

基于opencv的数字识别系统

一、目的 想要实现的功能&#xff1a;帮助我们在泵中扫描燃油&#xff0c;并在应用程序中输入燃油信息。 所需技术&#xff1a;①python程序对于拍摄的汽油泵的图像&#xff0c;尝试从中读取数字。——opencv实现。②先使用python对其进行原型设计&#xff0c;然后将代码转换…

TiDB分布式数据库部署与安装详解

TiUP 是 TiDB 4.0 版本引入的集群运维工具&#xff0c;TiUP cluster 是 TiUP 提供的使用 Golang 编写的集群管理组件&#xff0c;通过 TiUP cluster 组件就可以进行日常的运维工作&#xff0c;包括部署、启动、关闭、销毁、弹性扩缩容、升级 TiDB 集群&#xff0c;以及管理 TiD…

EMQX Enterprise 4.4.124.4.13 发布:集群负载重平衡、TDengine 3.0 适配以及子表批量插入

我们很高兴地告诉大家&#xff0c;EMQX Enterprise 4.4.12 以及 4.4.13 版本正式发布&#xff01; 在本次发布中&#xff0c;我们带来了集群负载重平衡与节点疏散功能为运维人员提供更灵活的集群管理方式&#xff0c;适配了 TDengine 3.0 版本并新增分表批量插入功能&#xff…

ECMAScript 2022 中的新特性!

新钛云服已累计为您分享718篇技术干货本文盘点ECMAScript 2022 中的新特性&#xff0c;包括顶级等待、RegExp 匹配索引、新的公共和私有类字段等。一、公共和私有实例字段最新的 ES13 规范允许我们将成员字段内联定义为类主体的一部分&#xff0c;我们可以使用#来表示私有字段。…