C++ 11 出来有段时间了,由于前阵子忙项目也没来得及看,现在开始使用cocos2d-x 3.0版本开发游戏就不得不去仔细学习一下 C++ 11 了,毕竟 cocos2d-x 3.0是使用了C++11的。
今天来学习一下C++11新特性的 lambda表达式。废话少说先上代码:
//构建lambda表达式,使用自动类型 auto初始化lambda,至于auto是什么东东,以后讲解,他也是c++11的新特性哦。
auto func = [](){printf("hello world \n");};
//执行函数
func();
执行结果如下:
好了,成功打印出了 hello world(看到这两个单词,是不是感到很熟悉,当然,身为程序猿你如果连这两个单词都不熟悉,你真可以去卖红薯了,哈哈,这可是编程史上出现频率最高的两种个单词,哇咔咔)。
看完代码,学过Java的同学是不是有种似曾相识的感觉,可能你已经想到了,对,就是Java匿名函数,当然Java的匿名函数不是这种写法啦,哈哈。但是作用基本相似。
下面讲解一下上面的代码,给我读者可能看完注释已经大概清楚两句代码的作用。接下来来说明一下具体含义:
首先 我们用auto来获得func的类型,也就是lambda类型的函数。然后是初始化 lambda表达式。
[]中括号里面可以通过填写不同的字符来表示对类里面的值的引用方式,[]他可以填写一下参数:
1,[]表示不截取任何外部变量
2,[&]表示以引用的方式来截取外部所有变量
3,[=]表示以复制的方式来截取外部所有变量(具体 赋值和引用来使用变量有何差别,这个不懂的同学可以去面壁了,哈哈,开玩笑了,如果不懂可以去看看C++基础课程哦)
4,[=var,&]表示以赋值的方式截取var变量,以引用的方式来截取外部除了var变量外的所有变量
5,[=,&var]结合4进行理解
6,[=var1,&var2]结合4,5进行理解
7,[var]表示只以复制的方式截取var变量,不截取其他外部的变量。
8,[this]表示截取当前类指针
擦,总算列举完了,估计大家看了之后也记不住的节奏,但是没关系记住前四条基本就OK了,其他的那些都是演变而来,都很好理解的,听我说完大家是不是马上就记住了,哈哈。(我就意淫一下,大家别当真。哇咔咔)
()小括号是用来对lambda表达式传参数的参数列表(听着很别扭,但是事实就是这样,千万别在意这些细节,更别在意我这捉急的表达能力)。函数参数列表我就不用讲解了,对于使用这些东东我相信大家都能达到卖油翁的水平了。
下面我们来取个例子说明一下lamb表达式的用处,代码如下:
//初始化一个字符串
char s[]="lambda!";
//统计字符总量,通过引用的方式被lambda表达式截取
int count = 0;
//增强for循环
for_each(s, s+sizeof(s), [&count] (char c) { printf("this char is : %c\n",c); count++; } )
; // 这大括号很容易看走眼的,这代码怎么规范好呢?
//打印结果
printf(" count's number is : %d\n",count);
程序输出结果为:
输出正常。
上面的例子使用增强for循环,内嵌了lambda表达式,这样虽然看起来有点乱的赶脚,但是执行效率比一般的for循环要快,因为在代码编译的时候简化“展开”这一步。
好了,以上就是我对lambda的理解,有不足之处希望大家多与我交流。