深入理解C++11:C++11新特性解析与应用

深入理解C++11:C++11新特性解析与应用

暂无评价综合评分的显示会考虑用户真实性等多项因素,每部作品出现综合评分的时间不定。
7.6224 评价豆瓣读书
免费试读
¥25.00¥18.00
今日特价截止至:2020-07-06 02:00:00了解详情

作品简介

国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IBM XL编译器中国开发团队共同撰写。不仅详细阐述了C++11标准的设计原则,而且系统地讲解了C++11新标准中的所有新语言特性、新标准库特性、对原有特性的改进,以及如何应用所有这些新特性。

本书一共8章:第1章从设计思维和应用范畴两个维度对C++11新标准中的所有特性进行了分类,呈现了C++11新特性的原貌;第2章讲解了在保证与C语言和旧版C++标准充分兼容的原则下增加的一些新特性;第3章讲解了具有广泛可用性、能与其他已有的或者新增的特性结合起来使用的、具有普适性的一些新特性;第4章讲解了C++11新标准对原有一些语言特性的改进,这些特性不仅能让C++变得更强大,还能提升程序员编写代码的效率;第5章讲解了C++11在安全方面所做的改进,主要涵盖枚举类型安全和指针安全两个方面的内容;第6章讲解了为了进一步提升和挖掘C++程序性能和让C++能更好地适应各种新硬件的发展而设计的新特性,如多核、多线程、并行编程方面的新特性;第7章讲解了一些颠覆C++一贯设计思想的新特性,如lambda表达式等;第8章讲解了C++11为了解决C++编程中各种典型实际问题而做出的有效改进,如对Unicode的深入支持等。附录中则介绍了C++11标准与其他相关标准的兼容性和区别、C++11中弃用的特性、编译器对C++11的支持情况,以及学习C++11的相关资源。

作品目录

  1. 免责声明
  2. IBM XL编译器中国开发团队简介
  3. 作者个人简介
  4. Preface
  5. 前言
  6. 为什么要写这本书
  7. 读者对象
  8. 本书作者和书籍支持
  9. 如何阅读本书
  10. 致谢
  11. 第1章 新标准的诞生
  12. 1.1 曙光:C++11标准的诞生
  13. 1.1.1 C++11/C++0x(以及C11/C1x)——新标准诞生
  14. 1.1.2 什么是C++11/C++0x
  15. 1.1.3 新C++语言的设计目标
  16. 1.2 今时今日的C++
  17. 1.2.1 C++的江湖地位
  18. 1.2.2 C++11语言变化的领域
  19. 1.3 C++11特性的分类
  20. 1.4 C++特性一览
  21. 1.4.1 稳定性与兼容性之间的抉择
  22. 1.4.2 更倾向于使用库而不是扩展语言来实现特性
  23. 1.4.3 更倾向于通用的而不是特殊的手段来实现特性
  24. 1.4.4 专家新手一概支持
  25. 1.4.5 增强类型的安全性
  26. 1.4.6 与硬件紧密合作
  27. 1.4.7 开发能够改变人们思维方式的特性
  28. 1.4.8 融入编程现实
  29. 1.5 本书的约定
  30. 1.5.1 关于一些术语的翻译
  31. 1.5.2 关于代码中的注释
  32. 1.5.3 关于本书中的代码示例与实验平台
  33. 第2章 保证稳定性和兼容性
  34. 2.1 保持与C99兼容
  35. 2.1.1 预定义宏
  36. 2.1.2 __func__预定义标识符
  37. 2.1.3 _Pragma操作符
  38. 2.1.4 变长参数的宏定义以及__VA_ARGS__
  39. 2.1.5 宽窄字符串的连接
  40. 2.2 long long整型
  41. 2.3 扩展的整型
  42. 2.4 宏__cplusplus
  43. 2.5 静态断言
  44. 2.5.1 断言:运行时与预处理时
  45. 2.5.2 静态断言与static_assert
  46. 2.6 noexcept修饰符与noexcept操作符
  47. 2.7 快速初始化成员变量
  48. 2.8 非静态成员的sizeof
  49. 2.9 扩展的friend语法
  50. 2.10 final/override控制
  51. 2.11 模板函数的默认模板参数
  52. 2.12 外部模板
  53. 2.12.1 为什么需要外部模板
  54. 2.12.2 显式的实例化与外部模板的声明
  55. 2.13 局部和匿名类型作模板实参
  56. 2.14 本章小结
  57. 第3章 通用为本,专用为末
  58. 3.1 继承构造函数
  59. 3.2 委派构造函数
  60. 3.3 右值引用:移动语义和完美转发
  61. 3.3.1 指针成员与拷贝构造
  62. 3.3.2 移动语义
  63. 3.3.3 左值、右值与右值引用
  64. 3.3.4 std::move:强制转化为右值
  65. 3.3.5 移动语义的一些其他问题
  66. 3.3.6 完美转发
  67. 3.4 显式转换操作符
  68. 3.5 列表初始化
  69. 3.5.1 初始化列表
  70. 3.5.2 防止类型收窄
  71. 3.6 POD类型
  72. 3.7 非受限联合体
  73. 3.8 用户自定义字面量
  74. 3.9 内联名字空间
  75. 3.10 模板的别名
  76. 3.11 一般化的SFINEA规则
  77. 3.12 本章小结
  78. 第4章 新手易学,老兵易用
  79. 4.1 右尖括号>的改进
  80. 4.2 auto类型推导
  81. 4.2.1 静态类型、动态类型与类型推导
  82. 4.2.2 auto的优势
  83. 4.2.3 auto的使用细则
  84. 4.3 decltype
  85. 4.3.1 typeid与decltype
  86. 4.3.2 decltype的应用
  87. 4.3.3 decltype推导四规则
  88. 4.3.4 cv限制符的继承与冗余的符号
  89. 4.4 追踪返回类型
  90. 4.4.1 追踪返回类型的引入
  91. 4.4.2 使用追踪返回类型的函数
  92. 4.5 基于范围的for循环
  93. 4.6 本章小结
  94. 第5章 提高类型安全
  95. 5.1 强类型枚举
  96. 5.1.1 枚举:分门别类与数值的名字
  97. 5.1.2 有缺陷的枚举类型
  98. 5.1.3 强类型枚举以及C++11对原有枚举类型的扩展
  99. 5.2 堆内存管理:智能指针与垃圾回收
  100. 5.2.1 显式内存管理
  101. 5.2.2 C++11的智能指针
  102. 5.2.3 垃圾回收的分类
  103. 5.2.4 C++与垃圾回收
  104. 5.2.5 C++11与最小垃圾回收支持
  105. 5.2.6 垃圾回收的兼容性
  106. 5.3 本章小结
  107. 第6章 提高性能及操作硬件的能力
  108. 6.1 常量表达式
  109. 6.1.1 运行时常量性与编译时常量性
  110. 6.1.2 常量表达式函数
  111. 6.1.3 常量表达式值
  112. 6.1.4 常量表达式的其他应用
  113. 6.2 变长模板
  114. 6.2.1 变长函数和变长的模板参数
  115. 6.2.2 变长模板:模板参数包和函数参数包
  116. 6.2.3 变长模板:进阶
  117. 6.3 原子类型与原子操作
  118. 6.3.1 并行编程、多线程与C++11
  119. 6.3.2 原子操作与C++11原子类型
  120. 6.3.3 内存模型,顺序一致性与memory_order
  121. 6.4 线程局部存储
  122. 6.5 快速退出:quick_exit与at_quick_exit
  123. 6.6 本章小结
  124. 第7章 为改变思考方式而改变
  125. 7.1 指针空值——nullptr
  126. 7.1.1 指针空值:从0到NULL,再到nullptr
  127. 7.1.2 nullptr和nullptr_t
  128. 7.1.3 一些关于nullptr规则的讨论
  129. 7.2 默认函数的控制
  130. 7.2.1 类与默认函数
  131. 7.2.2 “=default”与“=deleted”
  132. 7.3 lambda函数
  133. 7.3.1 lambda的一些历史
  134. 7.3.2 C++11中的lambda函数
  135. 7.3.3 lambda与仿函数
  136. 7.3.4 lambda的基础使用
  137. 7.3.5 关于lambda的一些问题及有趣的实验
  138. 7.3.6 lambda与STL
  139. 7.3.7 更多的一些关于lambda的讨论
  140. 7.4 本章小结
  141. 第8章 融入实际应用
  142. 8.1 对齐支持
  143. 8.1.1 数据对齐
  144. 8.1.2 C++11的alignof和alignas
  145. 8.2 通用属性
  146. 8.2.1 语言扩展到通用属性
  147. 8.2.2 C++11的通用属性
  148. 8.2.3 预定义的通用属性
  149. 8.3 Unicode支持
  150. 8.3.1 字符集、编码和Unicode
  151. 8.3.2 C++11中的Unicode支持
  152. 8.3.3 关于Unicode的库支持
  153. 8.4 原生字符串字面量
  154. 8.5 本章小结
  155. 附录A C++11对其他标准的不兼容项目
  156. A.1 C++11和C++03的不兼容项目
  157. A.2 C++和ISO C标准的不兼容项目
  158. A.3 C++11与C11的区别
  159. A.4 针对C++03的完善
  160. 附录B 弃用的特性
  161. 附录C 编译器支持
  162. 附录D 相关资源
  163. D.1 C++11特性建议稿
  164. D.2 其他有用的资源
载入中

热门划线

  1. 不过如果程序员声明了自定义的拷贝构造函数、拷贝赋值函数、移动赋值函数、析构函数中的一个或者多个,编译器都不会再为程序员生成默认版本3 人
  2. C++11将POD划分为两个基本概念的合集,即:平凡的(trivial)和标准布局的(standard layout)。3 人
  3. 在C++98中,支持了在类声明中使用等号“=”加初始值的方式,来初始化类中静态成员常量。这种声明方式我们也称之为“就地”声明。就地声明在代码编写时非常便利,不过C++98对类中就地声明的要求却非常高。如果静态成员不满足常量性,则不可以就地声明,而且即使常量的静态成员也只能是整型或者枚举型才能就地初始化2 人
  4. 在C++中,构造函数不能同时“委派”和使用初始化列表,所以如果委派构造函数要给变量赋初值,初始化代码必须放在函数体中。2 人
  5. 无论是声明一个左值引用还是右值引用,都必须立即进行初始化。而其原因可以理解为是引用类型本身自己并不拥有所绑定对象的内存,只是该对象的一个别名。左值引用是具名变量值的别名,而右值引用则是不具名(匿名)变量的别名。2 人
  6. 在常量左值引用在C++98标准中开始就是个“万能”的引用类型。它可以接受非常量左值、常量左值、右值对其进行初始化。而且在使用右值对其初始化的时候,常量左值引用还可以像右值引用一样将右值的生命期延长。不过相比于右值引用所引用的右值,常量左值所引用的右值在它的“余生”中只能是只读的。相对地,非常量左值只能接受非常量左值对其进行初始化。2 人
  7. 外一个问题可能是std::move使用的必要性。这里如果不使用std::move(m.h)这样的表达式,而是直接使用m.h这个表达式将会怎样?其实这是C++11中有趣的地方:可以接受右值的右值引用本身却是个左值2 人
  8. 为了保证移动语义的传递,程序员在编写移动构造函数的时候,应该总是记得使用std::move转换拥有形如堆内存、文件句柄等资源的成员为右值,这样一来,如果成员支持移动构造的话,就可以实现其移动语义。而即使成员没有移动构造函数,那么接受常量左值的构造函数版本也会轻松地实现拷贝构造,因此也不会引起大的问题。2 人
  9. 所以在C++11中,拷贝构造/赋值和移动构造/赋值函数必须同时提供,或者同时不提供,程序员才能保证类同时具有拷贝和移动语义。只声明其中一种的话,类都仅能实现一种语义。2 人
  10. 另外一个关于移动构造的话题是异常。对于移动构造函数来说,抛出异常有时是件危险的事情。因为可能移动语义还没完成,一个异常却抛出来了,这就会导致一些指针就成为悬挂指针。因此程序员应该尽量编写不抛出异常的移动构造函数,通过为其添加一个noexcept关键字,可以保证移动构造函数中抛出来的异常会直接调用terminate程序终止运行,而不是造成指针悬挂的状态2 人

喜欢这本书的人也喜欢