首先说明,虽然经常提到闭包,但我对闭包这个概念还真是不清晰,隐约感觉如果函数A中定义并返回了函数B,而函数B在函数A之外仍然可以正常运行并访问函数A中定义的变量,同时函数A中定义的变量不能被外部访问,就叫闭包——如果这个理解错了,那就当我啥也没说!
看到有人写博说通过C++11的新特性std::bind来实现闭包,仔细想了一下,其实通过C++03的两个特性就可以实现的:一个是局部类,一个是静态局部变量。
静态局部变量
C++允许在函数内部定义静态的局部变量,这些变量不会在离开函数时被销毁,就像这样
如果多次调用func,会发现输出到控制台的值一直在递增。 |
局部类
想在函数里定义局部函数是不可能的,C++没这个语法。但是可以在函数里定义局部类,这个类只能在该函数里使用,很有意思的,就像这样
如果需要将局部类对象返回到外面,就需要定义一个接口,用于接收返回的对象并调用其中的方法;同时,在函数内需要使用new来生成对象并返回其指针,就像这样
|
基础知识具备了,下面来实现闭包,过程就不说了,看注释吧
- #include <iostream>
- using namespace std;
- //////// 接口法实现 ////////////////////////////////////////
- // 定义一个函数对象接口……就像C#的委托
- class ITest {
- public:
- // 定义这个运算符主要是为了像函数一样调用,就像这样:obj();
- void operator() () {
- process();
- }
- protected:
- // 接口函数
- virtual void process() = 0;
- };
- // 下面函数返回一个ITest对象指针
- ITest* test() {
- // 函数内的静态变量,离开函数也不会销毁,而且可以
- static int count = 0;
- // 定义一个局部类
- class Test: public ITest {
- public:
- // 实现ITest中定义的接口函数来实现操作
- virtual void process() {
- cout << "Count is " << count++ << endl;
- }
- };
- // 返回一个新的对象……这里必须得new,你懂的
- return new Test();
- }
- //////// 函数法实现 ////////////////////////////////////////
- // 定义测试函数指针类型
- typedef void (*Func)(const char*);
- // 下面函数返回一个闭包中的函数
- Func testFunc() {
- // 静态局部变量初始化为100
- static int count = 100;
- // 静态局部常量
- static const char* const NAME = "James";
- // 不能直接定义函数,只好定义局部类的静态方法,并返回其指针
- class Test {
- public:
- // 这个定义说明可以传入参数,同理也可以有返回值
- static void process(const char* pName = NULL) {
- if (pName == NULL) { pName = NAME; }
- cout << pName << " Count is " << count-- << endl;
- }
- };
- return Test::process;
- }
- //////// 程序入口:主函数 //////////////////////////////////
- int main(int argc, char* argv[]) {
- ITest* pT = test();
- Func pF = testFunc();
- // 多次调用得从函数里返回出来的函数和对象,观察结果
- for (int i = 0; i < 10; i++) {
- (*pT)();
- pF((i % 2 == 0) ? NULL : "Fancy");
- }
- }
给个运行结果
- Count is 0
- James Count is 100
- Count is 1
- Fancy Count is 99
- Count is 2
- James Count is 98
- Count is 3
- Fancy Count is 97
- Count is 4
- James Count is 96
- Count is 5
- Fancy Count is 95
- Count is 6
- James Count is 94
- Count is 7
- Fancy Count is 93
- Count is 8
- James Count is 92
- Count is 9
- Fancy Count is 91
C++是门非常灵活的语言,我们平时用到的相对于C++ Specification来说,仅仅是冰山一角。虽然因为工作关系我已经有四五年没用它了,但它依然是我最喜欢的语言之一。
1、物理学(第六版)上册、下册 马文蔚 周玉青 版 课后习题答案 大学通用物理 课后题答案 东南大学等七所工科院校汇编 课后习题答案与解析 课后答案 全集https://www.cnblogs.com/liudianjia/p/12535157.html
2、编程精品教材:MATLAB程序设计与应用(第3版) 课后答案 刘卫国版 课后习题答案解析https://www.cnblogs.com/liudianjia/p/12513320.html
3、C语言程序设计(第3版) 何钦铭 颜晖 版 课后答案 习题解析https://www.cnblogs.com/liudianjia/p/12513272.html
4、数据库系统概论(第5版)课后答案https://www.cnblogs.com/liudianjia/p/12495990.html
5、数学物理方程第二版 课后习题答案 季孝达 薛兴恒 陆英 宋立功 版 第1章 课后答案解析https://www.cnblogs.com/liudianjia/p/12488902.html
6、Python语言程序设计基础(第2版)课后习题答案 嵩天、礼欣、黄天羽版 高等教育出版社 试题和答案和解析
https://www.cnblogs.com/liudianjia/p/12484952.html
7、大学 高等数学 大学线性代数 第五版 同济大学版 工程数学线性代数 课后习题答案https://www.cnblogs.com/liudianjia/p/12479110.html
8、Python语言程序设计基础(第2版)课后习题答案 嵩天、礼欣、黄天羽版 高等教育出版社 试题和答案和解析https://www.cnblogs.com/liu2020/p/12515245.html
9、编程精品教材:MATLAB程序设计与应用(第3版) 课后答案 刘卫国版 课后习题答案解析https://www.cnblogs.com/liu2020/p/12515240.html
10、离散数学(第2版)课后习题答案https://www.cnblogs.com/liu2020/p/12496066.html
11、数学物理方程 课后习题答案 清华大学出版社出版 姜玉山、徐延钦、王晓敏、张庆灵、刘超、李明维版 第2章 课后题答案与解析 复习提纲https://www.cnblogs.com/liu2020/p/12489032.html
12、高等数学(第七版)上册、下册 课后习题答案 同济大学数学系编写 高等教育出版社 大学数学 高等数学第七版第三章 答案与解析https://www.cnblogs.com/liu2020/p/12485055.html
13、工程数学线性代数 同济大学版 第六版 课后习题答案 高等数学 大学数学 线性代数 课后题答案与解析 考试复习提纲https://www.cnblogs.com/liu2020/p/12481993.html
14、数学模型(第五版)习题参考解答 高清 PDF电子版 电子书 电子版读书 姜启源、谢金星、叶俊 版 习题答案与解析https://www.cnblogs.com/awzh2020/p/12541824.html
15、操作系统教程(第5版)费翔林 骆斌 版 课后答案 第2章 课后习题答案解析https://www.cnblogs.com/awzh2020/p/12513557.html
16、离散数学学习指导与习题解析(第2版)PDF电子版图书 屈婉玲 耿素云 张立昂 课后题答案https://www.cnblogs.com/awzh2020/p/12513483.html