这是C++ Primer Plus第18章部分内容,做个总结
C++11新增的部分标准:
1.新类型 long long,unsigned long以支持64位或者更宽的整型;新增char16_t和char32_t以支持16位和32位的字符表示
2.统一的初始化,扩大了用大括号括起的初始化列表的适用范围,使其可用于所有的内置内型和用户定义的类型,使用初始化列 表时,可添加等号,也可以不添加。
3.C++11提供了多种简化声明的功能
3.1 auto 自动类型推断
3.2 decltype( x ) y; 让y的类型与x相同,x为表达式,定义模板时很有用
3.3 返回类型后置
double f1(double,int); 传统的声明
auto f2(double,int) -> double; 返回类型后置
这个主要用于模板函数
template<typename T,typename U>
auto eff( T t, U u) -> decltype(T*U)
{ … }
3.4 模板别名:using =
以前:typedef std::vector<std::string>::iterator itType;
现在:using itType = std::vector<std::string>::iterator ;
也可用于模板部分具体化
3.5 nullptr
4.智能指针 C++11 抛弃了auto_ptr 并新增了三种智能指针:unique_ptr ; shared_ptr ; weak_ptr
5. 摒弃了异常规范,新增关键字noexcept来指出函数不会引发异常有一定的价值
void f875( short , short) noexcept;
6. 作用域内枚举
enum Old1 { yes , no , maybe }; 传统的
enum class New1{ never, sometimes, often , always }; 新增
enum struct New2 { never, lever , sever }; 新增
新枚举要求进行显示限定,以免发生名称冲突。因此,引用特定枚举时,需使用New::never和New2::never。
7. 对类的修改 包括允许构造函数被继承和彼此调用、更佳的方法访问控制方式以及移动构造函数和移动赋值运算符。
7.1显示转换运算符,关键字explicit,以禁止单参数构造函数导致的自动转换,c++11对此做了拓展
7.2 类内成员初始化
通过使用类内初始化,可避免在构造函数中编写重复的代码,从而降低了程序员的工作量、厌倦情绪和 出错机会。如果构造函数在成员初始化列表中提供了相应的值,这些默认值将被覆盖。
8.模板和STL方面的修改
8.1基于范围的for循环
对于内置数组已经包含方法begin()和end()的类( 如std::string)和STL容器,基于范围的for循环可简化编写循环的工作。
double prices[5] = { 4.99,1.1,6.6.8.8,9.99};
for(double x : prices) 或者for(auto x : prices) 如果想改变值for(auto &x : prices)
操作
8.2 新的STL容器
C++11新增了STL容器forward_list 、unordered_map、unordered_multimap、unord_set和unordered_multiset。
容器forward_list是一种单向链表,只能沿着一个方向遍历;与双向链接的list容器相比更简单,占用存储空间更少。其他四 种容器都是使用哈希表实现的。
新增模板类array std::array<int,360> ar; //数组有360个数
8.3 新的STL方法
C++11新增cbegin(),cend(),crbegin(),crend(),这些方法将元素视为const
8.4 valarray升级
模板valarray独立于STL开发,其最初的设计导致无法将基于范围的STL算法用于valarray对象,c++11新增begin()和end()。
8.5 摒弃关键字export
8.6 尖括号
为避免与运算符>>混淆,c++要求在声明嵌套模板时使用空格将尖括号分开
vector<list<int> >; //老版本
vector<list<int>>; //c++11
9.右值引用
左值引用& 右值引用&&
int x = 10;
int y = 23;
int && r1 = 13;
int && r2 = x +y;
double && r3 = sqrt(2.0);
注意,r2关联到的是当时计算x+y得到的值,也就是说r2关联到23,即使以后修改了x或者y,也不会影响到r2。将右值关联到右值引用导致该右值被存储到特定的位置,且可以获取该位置的地址。也就是说,虽然不能将运算符&用于13,但可将其用于r1.通过将数据与特定地址关联,使得可以通过右值引用来访问数据。