什么是闭包

闭包有很多种定义,一种说法是,闭包是带有上下文的函数。说白了,就是有状态的函数。更直接一些,不就是个类吗?换了个名字而已。

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

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

内部包含 static 变量的函数,不是闭包, 因为这个 static 变量不能捆绑。你不能捆绑不同的 static 变量,这个在编译的时候已经确定了。

闭包的状态捆绑,必须发生在运行时。

闭包的实现

重载 operator()

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

class MyFunctor
{public:MyFunctor(int tmp) : round(tmp) {}int operator()(int tmp) { return tmp + round; }private:int round;
};
int main()
{int round = 2;MyFunctor f(round);//调用构造函数cout << "result = " << f(1) << endl; //operator()(int tmp)return 0;
}
lambda表达式
C++11 里提供的 lambda表达式就是很好的语法糖,其本质和手写的函数对象没有区别:int round = 2;auto f = [=](int f) -> int { return f + round; } ;cout << "result = " << f(1) << endl;

lambda表达式

C++11 里提供的 lambda表达式就是很好的语法糖,其本质和手写的函数对象没有区别:

 int round = 2;auto f = [=](int f) -> int { return f + round; } ;cout << "result = " << f(1) << endl;

std::bind

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

#include <iostream>#include <functional>using namespace std;
int func(int tmp, int round)
{return tmp + round;
}
int main()
{using namespace std::placeholders;    // adds visibility of _1, _2, _3,...int round = 2;std::function<int(int)> f = std::bind(func, _1, round);cout << "result = " << f(1) << endl;return 0;
}

C++的闭包(closure)相关推荐

  1. Scala编程之闭包(closure)

    一.概念 闭包:我们把一个函数与其相关引用环境(变量)组合成一个整体叫做闭包 概念晦涩难懂,下面我们用一个例子说明 二.小例子 def minusxy(x:Int) = (y:Int)=>x-y ...

  2. [转载]深入理解JavaScript闭包(closure)

    最近在网上查阅了不少Javascript闭包(closure)相关的资料,写的大多是非常的学术和专业.对于初学者来说别说理解闭包了,就连文字叙述都很难看懂.撰写此文的目的就是用最通俗的文字揭开Java ...

  3. 【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )

    文章目录 一.闭包的代理策略引入 二.闭包的四种代理策略 一.闭包的代理策略引入 分别在 Groovy 脚本 和 Test 类中定义 fun 方法 , 打印不同的内容 ; 在闭包 Closure 中分 ...

  4. 【Groovy】闭包 Closure ( 闭包类 Closure 简介 | this、owner、delegate 成员赋值及源码分析 )

    文章目录 总结 一.闭包类 Closure 简介 二.闭包类 Closure 中 this.owner.delegate 成员 源码分析 三.分析编译后的字节码文件内容 总结 在闭包中 , 打印 th ...

  5. 【Groovy】闭包 Closure ( 闭包参数绑定 | curry 函数 | rcurry 函数 | ncurry 函数 | 代码示例 )

    文章目录 一.闭包参数绑定 1.闭包参数绑定 curry 函数 2.闭包参数绑定 rcurry 函数 3.闭包参数绑定 ncurry 函数 二.完整代码示例 一.闭包参数绑定 闭包 Closure 提 ...

  6. 【Groovy】闭包 Closure ( 闭包参数列表规则 | 默认参数列表 | 不接收参数 | 接收自定义参数 )

    文章目录 一.闭包参数列表 二.闭包参数列表代码示例 一.闭包参数列表 闭包的参数设置有如下情况 : 不接收参数 : 如果在定义闭包时 , 只写了 " -> " 符号 , 没 ...

  7. 【Groovy】闭包 Closure ( 闭包调用 | 闭包默认参数 it | 代码示例 )

    文章目录 一.调用闭包 二.闭包默认参数 it 三.代码示例 一.调用闭包 执行 Closure 变量 的 call() 方法 , 可以调用该闭包 ; // 定义闭包变量def closure = { ...

  8. 【Groovy】闭包 Closure ( 闭包定义 | 闭包类型 | 查看编译后的字节码文件中的闭包类型变量 )

    文章目录 一.闭包定义 二.闭包类型 三.查看编译后的字节码文件中的闭包类型变量 一.闭包定义 闭包 Closure 是 Groovy 中最常用的特性 , 使用闭包作为参数是 Groovy 语言的明显 ...

  9. Kettle使用_16 闭包Closure Generator树形数据

    Kettle使用_16 闭包Closure Generator树形数据 需求: 通过Kettle的组件实现对树形结构数据的深度(层次)的生成. 解决方法:结合闭包Closure Generator.排 ...

  10. javascript中的闭包closure详解

    文章目录 简介 函数中的函数 Closure闭包 使用闭包实现private方法 闭包的Scope Chain 闭包常见的问题 闭包性能的问题 总结 简介 闭包closure是javascript中一 ...

最新文章

  1. python 装饰器 参数-[Python]写个带参数的装饰器
  2. Android --- 解决 cannot connect to daemon at tcp:5037: cannot connect to 127.0.0.1:5037: 由于目标计算机积极拒绝,无
  3. Docker完全自学手册
  4. Maven的学习资料收集--(九) 构建SSH项目以及专栏maven
  5. JS事件 卸载事件 当用户退出页面时(页面关闭、页面刷新等),触发onUnload事件,同时执行被调用的程序。注意:不同浏览器对onunload事件支持不同。...
  6. R语言列表(list)与向量(numeric)的转换
  7. 【STM32】初识STM32(型号+封装+内核+储存器+时钟、复位和电源管理+工作模式+ADC)
  8. BZOJ3728 PA2014Final Zarowki
  9. 教育部计算机考研大纲,2021考研计算机大纲计算机组成原理部分考查内容
  10. iOS开发中那些高效常用的宏
  11. 开关电源设计从入门到精通(附教程)
  12. JAVA优秀开源框架收集
  13. 使用zlog实现日志记录
  14. 计算机四分位数公式,上四分位数(上下四分位数计算公式)
  15. 学编程难吗?多久能入门?
  16. 众筹php,PHP众筹网源码 众筹网源码
  17. Dubbo超详细学习笔记
  18. java俄罗斯方块七中图形类_用shell写俄罗斯方块
  19. 终端文本编辑神器--Vim命令详解。如何配置使用Vim、Vim插件?
  20. php notice 性能,【OneAPM出品】解决Notice错误性能提升

热门文章

  1. NOIP2011 复盘
  2. Redis 读写分离
  3. c语言strdup函数_在C / C ++中使用strdup()函数的指南
  4. 实训九 思科路由器上配置RIPv2
  5. 思科高级配置(三层交换配置路由)
  6. Hive分区——Partition(静态分区,动态分区)详解
  7. c语言中%c和%s的区别
  8. linux查看用户ulimit,linux下关于ulimit
  9. 【算法练习】杂题混讲一:Acwing + 蓝桥杯练习
  10. java版本 multimap,java-multimap使用