2011年,新的C++11标准诞生,用于取代C++98标准;
2014年,C++14标准发布,该标准库对C++11标准库做了更优的修改和更新;
2017年,C++17标准正式发布。
auto varname = value;
1)使用auto类型推导的变量必须马上初始化;
2)auto不能在函数的参数中使用;
3)auto不能作用于类的非静态成员变量(也就是没有static关键字修饰的成员变量)中
4)auto关键字不能定义数组;
5)auto不能作用于模板参数;
auto的应用:使用auto定义迭代器;auto用于泛型编程。
decltype(exp) varname [= value];
auto根据=右边的初始值value推导出变量的类型,而decltype根据exp表达式推导出变量的类型;
auto将变量的类型和初始值绑定在一起,而decltype将变量的类型和初始值分开;
虽然auto的书写更加简洁,但decltype的使用更灵活;
auto虽然在书写格式上比decltype简单,但是它的推导规则复杂,有时候会改变表达式的原始类型(如抛弃引用、const类型等);而decltype比较纯粹,它一般会坚持保留原始表达式的任何类型,让推导的结果更加原汁原味。
在泛型编程中,可能需要通过参数的运算来得到返回值的类型。因此,在C++11中增加了返回类型后置(trailing-return-type,又称跟踪返回类型)语法,将decltype和auto结合起来完成返回类型的推导。如:
template
auto add(T t, U u) ->decltype(t + u)
{
teturn t + u;
}
返回类型后置语法,是为了解决函数返回值类型依赖于参数而导致难以确定返回值类型的问题。
C++11使用using定义别名(替代typedef)。using别名语法比typedef更加清晰。因为typedef的别名语法本质上类似一种解方程的思路。而using语法通过赋值来定义别名,和我们平时的思考方式一致。如:
typedef unsigned int uint_t;
using uint_t = unsigned int;
typedef std::map
using map_int_t = std::map
C++11 for循环(基于范围的循环):for(declaration : expression){}。
C++11标准新引入了一种类模板,命名为tuple(元组),定义在
C++11 nullptr:初始化空指针 NULL隐式转换为整形,而nullptr可以隐式匹配指针类型,因此相比NULL和0,使用nullptr初始化空指针可以令我们编写的程序更加健壮。
在实际的C++开发中,经常会遇到程序运行中突然奔溃、程序运行所用内存越来越多最终不得不重启等问题,这些问题往往都是内存资源管理不当造成的。比如:
1)有些内存资源已经释放,但指向它的指针并没有改变指向(成为了野指针),并且后续还在使用
2)有些内存资源已经释放,后期又试图再释放一次(重复释放同一块内存会导致程序运行崩溃)
3)没有及时释放不再使用的内存资源,造成内存泄漏,程序占用的内存资源越来越多。
C++11新标准在废弃auto_ptr的同时,增添了unique_ptr、shared_ptr、weak_ptr 3个智能指针来实现堆内存的自动回收。
C++智能指针底层是采用引用计数的方式实现的,每种智能指针都是以类模板的方式实现的,定义位于
和shared_ptr指针最大的不同之处在于,unique_ptr指针指向的堆内存无法同其它unique_ptr共享,也就是说,每个unique_ptr指针都独自拥有对其所指堆内存空间的所有权;
weak_ptr 类型指针视为 shared_ptr 指针的一种辅助工具,借助 weak_ptr 类型指针, 我们可以获取 shared_ptr 指针的一些状态信息,比如有多少指向相同的 shared_ptr 指针、shared_ptr 指针指向的堆内存是否已经被释放等等;
weak_ptr 类型指针并不会影响所指堆内存空间的引用计数;
weak_ptr 类型指针只能访问某一 shared_ptr 指针指向的堆内存空间,无法对其进行修改。