Cocos 3.x 用了大量的C++ 11 的东西,所以作为一个C++忠实粉丝,有必要对C++ 11进行一个系统的学习。

使用C++11之前,一定要注意自己使用的编译器对C++11的支持情况,有些编译器并不是完全支持,比如我正在使用的vs2012。这里是msdn里面VS各版本对C++ 11 的支持 对 C++11 功能的支持(现代 C++)

1.auto

auto这个关键字C++原先就有,用来指定存储器。因为很少有人去用这个东西,所以在C++11中就把原有的auto功能给废弃掉了,而变成了现在的类型推导关键字。先说下auto的简单用法:

#include <iostream>
#include <vector>
#include <map>
using namespace std; int main() {
auto num = ; //num 是int类型
auto c = 'A'; //c 是char类型
auto str("test"); // str是char数组 map<string, vector<int>> map;
for(auto it = begin(map); it != end(map); ++it) // it 为迭代器类型
{
} return ;
}

这样使用最明显的好处就是在使用迭代器遍历STL容器的时候,不用去声明那些迭代器的类型,也不用去使用typedef就能很简洁的实现遍历了。

从效率上来说,auto不会对运行时效率产生影响,它是在编译的时候推导类型的,例如上面的代码,编译的时候,就会把num变量转换为int类型。

auto和其他变量类型有明显的区别:

1.auto声明的变量必须要初始化,否则编译器不能判断变量的类型。

2.auto不能被声明为返回值,auto不能作为形参,auto不能被修饰为模板参数

3.

2.decltype

decltype关键字和auto相互对应的,它们经常在一些场所配合使用。decltype可以在编译的时候判断出一个变量或者表达式的类型,例如:

#include <iostream>
#include <vector>
#include <map>
using namespace std; void func(auto can) {
int a;
} int main() {
auto num = ; //num 是int类型
decltype(num) num2 = num; //num2 也是int类型 return ;
}

这里decltype拿到了num的类型,然后用这个类型定义了num2做了num的一份copy。auto和decltype还有一种经典的使用场合,看下面例子:

template <typename T1, typename T2>
auto compose(T1 t1, T2 t2) -> decltype(t1 + t2)
{
return t1+t2;
}

这里是用一个模板来计算两个变量的加法,如果两个类型T1和T2不一样的话,t1+t2的类型将由编译器来决定,这样使用decltype就可以拿到返回的类型。但是如果把decltype(t1 + t2)放到函数命名的前面作为返回值的话,按照编译器的解析顺序,当解析到返回值decltype(t1 + t2)的时候t1和t2还没有被定义,所以要重新声明t1和t2的类型,这样就会变的很复杂很难读懂。

于是C++11就改变了语法规则,把decltype(t1 + t2)放到函数的后方,并用auto作为返回值来告诉编译器,真正的返回值在函数声明之后。简单的说auto可以作为返回值占位符来使返回值后置。

最新文章

  1. C#给PDF文档添加文本和图片页眉
  2. Oracle常用的SQL方法总结
  3. ANE原生代码的调试(安卓)
  4. ACRush 楼天成回忆录
  5. 韩系高端PK:whoo后VS雪花秀(转载)
  6. 论文阅读之 DECOLOR: Moving Object Detection by Detecting Contiguous Outliers in the Low-Rank Representation
  7. Careercup - Google面试题 - 4557716425015296
  8. RocketMQ集群部署配置
  9. 什么是HTTP Referer?
  10. 必看!如何让你的LBS服务性能提升十倍!
  11. [ZZ] 边缘检测 梯度与Roberts、Prewitt、Sobel、Lapacian算子
  12. SQL server 2008(Linux安装)
  13. zabbix API应用
  14. KMP 算法详解
  15. Kangax 的 ES7 兼容性表格
  16. android 阿里云oss上传
  17. js处理包含中文的字符串
  18. PHP处理Ajax请求与Ajax跨域
  19. PHP方便快捷的将二维数组中元素的某一列值抽离出来作为此二维数组内元素的key
  20. DSOFramer 控件修改成功

热门文章

  1. webpack之代码分离
  2. --@angularJS--浅谈class与Ng-Class的应用
  3. HTML 颜色名
  4. 删除SVN文件 Delete SVN Folders.reg
  5. 让Flash支持Stage3D
  6. C++中的RAII技法
  7. 《JAVASCRIPT高级程序设计》第三章
  8. bcnf范式
  9. 根据dba_hist_osstat统计CPU占用情况
  10. Vue.js 系列教程 4:Vuex