c++11
1.智能指针
解决了内存泄露和野指针
2.空指针:nullptr
以前(NULL)
3.auto关键字** 用于定义变量,编译器可以自动判断的类型
(前提:定义一个变量时对其进行初始化)
4.右值引用
//左值引用
以前:
int num = 10;
int &b = num; //正确
int &c = 10; //错误,在C++98/03标准中,无法为右值添加引用
int num = 10;
int &b = num; //正确
int &c = 10; //错误,在C++98/03标准中,无法为右值添加引用
实际开发中可能需要对右值进行修改(实现移动语义时就需要),显然左值引用的方式是行不通的。
为此,C++11 标准新引入了另一种引用方式,称为右值引用,用 “&&” 表示。
右值引用也是别名,但其只能对右值引用
int num = 10;
//int && a = num; //右值引用不能初始化为左值
int && a = 10;
int num = 10;
//int && a = num; //右值引用不能初始化为左值
int && a = 10;
5.标准库扩充(往STL里新加进一些模板类,比较好用)
(1)无序容器(哈希表)
用法和功能同map一模一样,区别在于哈希表的效率更高
(2)array
固定大小的数组,静态数组,
array价值:
1.支持迭代器,更好兼容STL容器的玩法
2.对于越界的检查(最核心的地方)
(3)forward_list
单向链表
支持头插头删,不支持尾插尾删,
不支持在当前位置前面插入和当前位置的删除,支持在当前位置后面插入和删除当前位置后面的
价值:每个节点省了一个指针
(4)匿名函数lambda
6.扩大列表初始化的范围
c++98列表初始化如下:
对于一些自定义的类型,却无法使用这样的初始化。
就无法通过编译,导致每次定义vector时,都需要先把vector定义出来,然后使用循环对其赋初始值,非常不方便。
C++11扩大了用大括号括起的列表(初始化列表)的使用范围,使其可用于所有的内置类型和用户自定义的类型,使用初始化列表时,可添加等号(=),也可不添加。
7.override
指定一个函数覆盖另外一个函数
override作用是帮助检查是否继承了想要继承的虚函数。可以避免出现 “在继承的时候写错了函数(参数类型、参数个数不符),编译没问题但是程序运行时和预想的不一样” 的情况。
建议重写虚函数的时候加上 override。
建议重写虚函数的时候加上 override。
8.final
作用:指定某个虚函数不能在子类中被覆盖,或者某个类不能被子类继承。
9.支持线程
windows和linux下各有自己的接口,这使得代码的可移植性比较差。
C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库要使用标准库中的线程,必须包含< thread >头文件。