C++11数据类型特性
1.新增加了类型
longlong 与unsigned long long 以支持对64 Int 类型的支持;新增加了char16_t与char32_t来支持char类型的16位与32位的字符表示 ; 新增加了auto关键字,让编译器根据初始值的类型推断变量的类型
2.右值引用
传统的左值是一个表示数据的表达式(如变量名以及指针等),左值可以放于赋值表达式的左边;
右值仅仅是一块数据(返回值,表达式结果值),右值一般可以放到赋值表达式的右边
右值引用的出现,使得我们可以直接对这块右值数据进行引用,然后进行数据上的一些操作,避免重复的复制。
举例
符号重载+
构造函数:参数为值引用
构造函数:右值引用参数
3.统一的初始化
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有内置类型和用户定义的类型(即类对象),使用初始化列表的时候可以添加等号(=),也可以省略
模板 initializer_list 模板初始化列表
您可以使用初始化列表来为Stl容器初始化为一系列值
std::vector<double> a {6.5,7.47,3.65,5.45};
支持初始化列表中进行隐式转换(精度由低到高)
4.模板别名
typedef std::array<double,12>arrd ;
typedef std::array<int,12>arri ;
typedef std::array<float,12>arrf ;
arrd a; arri b; arrf c; //使用别名来声明对象
进行模板别名应用
template <typename t >
using arrtype = std::array<t,12>
arrtype<double> a;
arrtype<int>b;
arrtype<float> c;
11中还允许为非模板类进行定义别名
C++11结构流程新特性
1.基于范围的for循环
double p[5] = {4.5,4.6,452.2,66.1};
for(double x : p) //非引用版本。替换表达式为 for( double &x : p)为引用版本
cout<< x <<endl;
2.作用域内枚举
传统枚举中,相同作用域下的相同枚举值将无法通过编译
使用类作为枚举量的作用域
其中作用域内枚举无法隐式完成整型转换,而传统可以
3.无序关联容器
有序关联容器即普通的Map由红黑树构建底层,会根据键值进行排序,优化查找速率
无序关联容器即HashMap底层由哈希表来构建,每次插入新值不会进行排序,未优化查找效率,但提高了删除和添加的效率
4. 异常规范
在C++98中加入的异常规范,在C++11中不建议使用,以此来编译器优化代码
原加入的异常规范举例:
可以使用新增关键字noexception来显示保证函数不会引发异常
5.Lambda表达式 :允许在函数内定义函数表达式
优势:相对于函数符(一种函数类),常规函数,lambda更加的简洁(代码量少),直接(定义与声明合二为一),
高效(相对于函数指针,Lambda与函数符不会阻止内联优化),特殊功能(具有作用域变量引用/赋值)
[](int x){ return ~; } 省略返回值得类型是由decltype根据返回值进行推导的 (仅适用于函数体内包含仅return一条语句的情况)
否则如果函数体内有多条语句:[](int x) -> double{ int y = 2; return y+x } 使用后置返回值
重点:可以使用[&变量名称]来进行对作用域内的变量进行值引用使用,否则,为值传递 (类似于Lua中的UpValue概念)