C++11 简介

一、什么是 C++11

2011 年 8 月 12 日,国际标准化组织(ISO)正式通过 C++ 的新版本——C++11。C++11 为 C++ 语言增添了大量新特性。使用这些新特性完全自愿,但你一定会发现其中一些非常有用。此前的所有教程均已更新,以符合 C++11 标准。

二、C++11 的目标与设计原则

Bjarne Stroustrup 将 C++11 的目标概括为:

  • 在 C++ 的强项之上继续发展——与其把 C++ 强行扩展到可能较弱的领域(例如带有复杂 GUI 的 Windows 应用),不如把 C++ 已经擅长的事情做得更好。
  • 让 C++ 更易于学习、使用与教学——通过提供新功能,使语言更加一致、易用。

为此,制定标准的委员会遵循以下总体原则:

  • 在可能的情况下,保持与旧版 C++ 以及 C 的稳定性和兼容性;在 C++03 下能正常工作的程序,一般也应在 C++11 下正常工作。
  • 尽量控制核心语言扩展的数量,把大部分改动放入标准库(这一目标在本版本中并未完全实现)。
  • 重点改进抽象机制(类、模板),而非为特定、狭窄场景增加机制。
  • 为初学者与专家同时提供新功能——“人人有份”。
  • 增强类型安全,防止无意中的缺陷。
  • 提升性能,使 C++ 能够直接操作硬件。
  • 考虑可用性与生态系统问题:C++ 需与其他工具良好协作,易于使用与教学,等等。

整体而言,C++11 并未在主题上与 C++03 分道扬镳,但它确实引入了海量新功能。

三、C++11 的主要新特性

为方便查阅,下面列出 C++11 引入的部分重要特性。此列表并非穷尽,仅用于凸显关键亮点:

  • auto(参见 课程《使用 auto 关键字进行对象类型推导》)
  • char16_tchar32_t 及其新字面量(暂无教程)
  • constexpr(参见 课程《常量变量(具名常量)》)
  • decltype(在 课程《数组、循环与符号挑战解答》中提及)
  • default 说明符(参见 课程《默认构造函数与默认实参》)
  • 委托构造函数(参见 课程《委托构造函数》)
  • delete 说明符(参见 课程《删除函数》)
  • 枚举类(enum class)(参见 课程《作用域枚举(enum class)》)
  • extern 模板(暂无教程)
  • Lambda 表达式(参见 课程《Lambda(匿名函数)简介》)及其捕获(参见 课程《Lambda 捕获》)
  • long long int(参见 课程《对象大小与 sizeof 运算符》)
  • 移动构造函数与移动赋值(参见 课程《移动构造函数与移动赋值》)
  • noexcept 说明符(在 课程《未捕获异常与全捕获处理器》中简要提及)
  • nullptr(参见 课程《空指针》)
  • overridefinal 说明符(参见 课程《override 与 final 说明符及协变返回类型》)
  • 基于范围的 for 语句(参见 课程《基于范围的 for 循环(for-each)》)
  • 右值引用(参见 课程《右值引用》)
  • static_assert(参见 课程《assert 与 static_assert》)
  • std::initializer_list(参见 课程《std::initializer_list》)
  • 尾置返回类型语法(参见 课程《使用 auto 关键字进行对象类型推导》)
  • 类型别名(参见 课程《typedef 与类型别名》)
  • typedef 现可为模板类创建别名
  • 统一初始化(参见 课程《基本数据类型简介》)
  • 用户定义字面量(暂无教程)
  • 可变参数模板(暂无教程)
  • 连续两个 >> 若无空格,现可正确解析为模板结束符号

此外,C++ 标准库新增了大量新类,包括:

  • 更完善的多线程支持与线程局部存储(暂无教程)
  • 哈希表(暂无教程)
  • 随机数生成改进(基本讨论见 课程《使用 Mersenne Twister 生成随机数》)
  • 引用包装器(参见《对象切片》)
  • 正则表达式(暂无教程)
  • std::auto_ptr 已被弃用(参见 课程《智能指针与移动语义简介》)
  • std::tuple(暂无教程)
  • std::unique_ptr(参见课程《std::unique_ptr》)

关注公众号,回复"cpp-tutorial"

可领取价值199元的C++学习资料

公众号二维码

扫描上方二维码或搜索"cpp-tutorial"