C++11新特性
新类型
long long
和unsigned long long
。支持64位或更宽的整型。
char16_t
和char32_t
。支持16位和32位字符表示。
统一的初始化
初始化列表{...}
现在可用于所有内置类型和用户定义的类型。
C++11还提供了initialize_list
模板类,可将其用作构造函数参数。
声明
auto
推断类型。decltype
将变量的类型声明为表达式指定的类型。(decltype(expression) y
即让y的类型与expression相同)auto func(...) -> <typename>;
(新增一种函数声明语法:返回类型后置)using ... = ...
(模板别名)(与typedef区别是可用于模板部分具体化)nullptr
(空指针,与NULL或者0的区别是nullptr不能转换为整数,提供了更高的类型安全)
智能指针
C++11摒弃了auto_ptr
,新增了unique_ptr
、shared_ptr
、weak_ptr
类型。
异常规范的修改
C++11摒弃了异常规范。(异常规范用于指出函数可能引发哪些异常)
但是C++11增加了关键字noexcept
,它指出函数不会引发异常。
作用域内枚举
传统的C++枚举的类型检查相当低级,枚举名的作用域为枚举定义属同一作用域。所以可能会和其他枚举冲突。
C++新增了一种枚举,用enum struct XXX
或者enum class XXX
定义。新的枚举要进行显式限定以免名称冲突。
CRE:类似C#的枚举,需要显式限定的。
关于类的修改
- explicit关键字:
C++引入了关键字explicit
,以禁止单参数构造函数导致的自动转换。
explicit Person(double);
C++11拓展了explicit
的用法,使得可对转换函数做类似处理。
explicit operator double() const;
- 类成员初始化:
class Person { int id = 0; double weight {50.0f}; //可以使用等号或者大括号版本的初始化。 }
STL和模板的修改
- 容器或内置数组的for循环:
for(auto x : xxx) { ... }
- 新的STL容器:
forward_list
单链表,比双向链表更简单。
unordered_map
、unordered_set
….使用哈希表而非红黑树实现的关系映射表。
- 新的STL方法:
cbegin
、cend()
。新方法将元素视为const
。
- valarray可以使用STL算法:
begin()
、end()
。
- export已摒弃:
C++11终止了export的用法,但仍然保留关键字export
以供以后使用。
- 尖括号:
模板嵌套是两个>
之间用空格分开防止与>>
混淆。
右值引用和新的构造函数
(详见右值引用和移动语义)
C++11还新增了移动构造函数和移动赋值运算符。
新的类功能
- 默认方法和禁用方法:
显式声明构造函数的默认版本。
Someclass() = default
Someclass(const Someclass &) = default
禁止复制对象–禁止复制构造函数和复制赋值运算符。
Someclass(const Someclass &) = delete;
Someclass & operator=(const Someclass &) = delete
- 委托构造函数:
Someclass::Someclass() : Someclass(0, 0.1, "xxx") { /*...*/ }
- 继承构造函数:
C++可用using <XXX>::<YYY>
让作用域XXX内的命名空间成员或者类成员暴露出来。
C++11将这种方法用于构造函数,使得子类继承基类所有构造函数。
当没有对应的子类构造函数定义时,会使用继承来的构造函数。
CRE:C#中可使用base()来调用基类构造函数。
- 虚方法的override和final关键字(标识符):
override
:指出覆盖一个虚函数,而不是隐藏。(用于检查和确保虚函数重写无误,因为如果特征标不匹配将隐藏而不是覆盖旧版本)
final
:禁止覆盖虚函数。
CRE:在C#可以使用sealed来禁止再次重写。
Lambda表达式以及包装器/适配器
(详见函数指针、函数对象、Lambda表达式.md)
可变参数模板
(详见C++PrimerPlus)
C++11新增的其他功能
- 多线程支持:
<atomic>
原子操作库。
<thead>
线程支持库。
<mutex>
线程支持库。
<condition_varible>
线程支持库。
<future>
线程支持库。
。。。。
- 新增的其他库:
<chrono>
提供了处理时间间隔的途径。
<tuple>
提供广义的pair对象,存储任意个的类型不同的值。
<ratio>
有理数库。
<regex>
正则表达式库。
。。。。
- 低级编程:
- 放松了对POD(Plain Old Data)的要求。
- 允许共用体的成员有构造和析构函数。
- 解决了内存对齐问题。要控制对齐方式可使用说明符
alignas
。要获悉类型或对象的对齐要求可使用运算符alignof()
。
- 杂项:
扩展整型。
字面量运算符。
调试工具assert。
元编程支持。
(END)