Effective Modern C++(中文版)

Book description

想要彻底理解C++11和C++14,不可止步于熟悉它们引入的语言特性(例如,auto型别推导、移动语义、lambda表达式,以及并发支持)。挑战在于高效地运用这些特性,从而使你的软件具备正确性、高效率、可维护性和可移植性。这正是本书意欲达成的定位。它描述的正是使用C++11和C++14(即现代C++)来编写真正卓越的软件之道。

涵盖以下主题:

  • 大括号初始化、noexcept规格、完美转发,以及智能指针的make函数的优缺点。
  • std::move、std::forward、右值引用和万能引用之间的联系。
  • 编写整洁、正确,以及高效的lambda表达式的方法。
  • std::atomic和volatile有怎样的区别,它们分别用于什么场合,以及它们和C++的并发API有何联系。
  • “旧”C++程序设计(即C++98)中的最佳实战要求在现代C++的软件开发中作出哪些修订。

本书沿用了Scott Meyers早期作品中业已证明的基于指导原则和实例驱动的格式,但介绍的是全新材料。本书是所有C++软件开发工程师的必读之选。

Table of contents

  1. 封面
  2. 对本书的赞誉
  3. 版权页
  4. O'Reilly介绍
  5. 推荐序
  6. 译者序
  7. 目录 (1/2)
  8. 目录 (2/2)
  9. 出版商声明
    1. 代码示例的使用
    2. Safari® Books Online
    3. 如何联系我们
  10. 致谢
  11. 绪论
    1. 术语和惯例
    2. 提交缺陷报告和改进建议
  12. 第1章 型别推导
    1. 条款1:理解模板型别推导
      1. 情况1:ParamType是个指针或引用,但不是个万能引用
      2. 情况2:ParamType是个万能引用
      3. 情况3:ParamType既非指针也非引用
      4. 数组实参
      5. 函数实参
      6. 要点速记
    2. 条款2:理解auto型别推导
      1. 要点速记
    3. 条款3:理解decltype
      1. 要点速记
    4. 条款4:掌握查看型别推导结果的方法
      1. IDE编辑器
      2. 编译器诊断信息
      3. 运行时输出
      4. 要点速记
  13. 第2章 auto
    1. 条款5:优先选用auto,而非显式型别声明
      1. 要点速记
    2. 条款6:当auto推导的型别不符合要求时,使用带显式型别的初始化物习惯用法
      1. 要点速记
  14. 第3章 转向现代C++
    1. 条款7:在创建对象时注意区分()和{}
      1. 要点速记
    2. 条款8:优先选用nullptr,而非0或NULL
      1. 要点速记
    3. 条款9:优先选用别名声明,而非typedef
      1. 要点速记
    4. 条款10:优先选用限定作用域的枚举型别,而非不限作用域的枚举型别
      1. 要点速记
    5. 条款11:优先选用删除函数,而非private未定义函数
      1. 要点速记
    6. 条款12:为意在改写的函数添加override声明
      1. 要点速记
    7. 条款13:优先选用const_iterator,而非iterator
      1. 要点速记
    8. 条款14:只要函数不会发射异常,就为其加上noexcept声明 (1/2)
    9. 条款14:只要函数不会发射异常,就为其加上noexcept声明 (2/2)
      1. 要点速记
    10. 条款15:只要有可能使用constexpr,就使用它
      1. 要点速记
    11. 条款16:保证const成员函数的线程安全性
      1. 要点速记
    12. 条款17:理解特种成员函数的生成机制
      1. 要点速记
  15. 第4章 智能指针
    1. 条款18:使用std::unique_ptr管理具备专属所有权的资源
      1. 要点速记
    2. 条款19:使用std::shared_ptr管理具备共享所有权的资源
      1. 要点速记
    3. 条款20:对于类似std::shared_ptr但有可能空悬的指针使用std::weak_ptr
      1. 要点速记
    4. 条款21:优先选用std::make_unique和std::make_shared,而非直接使用new
      1. 要点速记
    5. 条款22:使用Pimpl习惯用法时,将特殊成员函数的定义放到实现文件中
      1. 要点速记
  16. 第5章 右值引用、移动语义和完美转发
    1. 条款23:理解std::move和std::forward
      1. 要点速记
    2. 条款24:区分万能引用和右值引用
      1. 要点速记
    3. 条款25:针对右值引用实施std::move,针对万能引用实施std::forward
      1. 要点速记
    4. 条款26:避免依万能引用型别进行重载
      1. 要点速记
    5. 条款27:熟悉依万能引用型别进行重载的替代方案
      1. 舍弃重载
      2. 传递const T&型别的形参
      3. 传值
      4. 标签分派
      5. 对接受万能引用的模板施加限制 (1/2)
      6. 对接受万能引用的模板施加限制 (2/2)
      7. 权衡
      8. 要点速记
    6. 条款28:理解引用折叠
      1. 要点速记
    7. 条款29:假定移动操作不存在、成本高、未使用
      1. 要点速记
    8. 条款30:熟悉完美转发的失败情形
      1. 大括号初始化物
      2. 0和NULL用作空指针
      3. 仅有声明的整型static const成员变量
      4. 重载的函数名字和模板名字
      5. 位域
      6. 结语
      7. 要点速记
  17. 第6章 lambda表达式
    1. 条款31:避免默认捕获模式 (1/2)
    2. 条款31:避免默认捕获模式 (2/2)
      1. 要点速记
    3. 条款32:使用初始化捕获将对象移入闭包
      1. 要点速记
    4. 条款33:对auto&&型别的形参使用decltype,以std::forward之
      1. 要点速记
    5. 条款34:优先选用lambda式,而非std::bind (1/2)
    6. 条款34:优先选用lambda式,而非std::bind (2/2)
      1. 要点速记
  18. 第7章 并发API
    1. 条款35:优先选用基于任务而非基于线程的程序设计
      1. 要点速记
    2. 条款36:如果异步是必要的,则指定std::launch::async
      1. 要点速记
    3. 条款37:使std::thread型别对象在所有路径皆不可联结
      1. 要点速记
    4. 条款38:对变化多端的线程句柄析构函数行为保持关注
      1. 要点速记
    5. 条款39:考虑针对一次性事件通信使用以void为模板型别实参的期值
      1. 要点速记
    6. 条款40:对并发使用std::atomic,对特种内存使用volatile
      1. 要点速记
  19. 第8章 微调
    1. 条款41:针对可复制的形参,在移动成本低并且一定会被复制的前提下,考虑将其按值传递
      1. 要点速记
    2. 条款42:考虑置入而非插入
      1. 要点速记
  20. 作者介绍
  21. 封面介绍

Product information

  • Title: Effective Modern C++(中文版)
  • Author(s): Scott Meyers
  • Release date: April 2018
  • Publisher(s): China Electric Power Press Ltd.
  • ISBN: 9787519817749

You might also like

book

云原生:运用容器、函数计算和数据构建下一代应用

by Boris Scholl, Trent Swanson, Peter Jausovec

开发者们刚开始接触云端服务开发的时候或多或少都会遇到一些障碍。既要学习分布式系统的知识,又要熟悉像容器和函数计算这样的新技术,还要综合运用这些知识来构建云原生应用实在是件令人望而生畏的事情。本书可以帮助你掌握构建云原生应用的方法,比如消息通信、事件通知和DevOps等。 本书介绍了构建现代云原生应用的架构模块。你将学会如何使用微服务、容器、无服务器架构、函数计算等技术,并挑选合适的存储类型,同时考虑可移植性等问题。你会从云原生应用的基础知识开始,一步步地了解设计、开发和运维云原生应用的整个过程。 探讨设计云原生应用所需的技术。 介绍容器和函数计算的区别,并学习它们的适用场景。 有针对性地设计应用来满足数据相关的需求。 学习DevOps的基础知识和一些开发、测试、运维实践。 学习一些构建和管理云原生应用的技巧、方法和实践。 理解构建一个具有可移植性的应用所需的代价,并且学会对需求做出取舍。

book

C++程序设计:原理与实践(基础篇)(原书第2版)

by 本贾尼 斯特劳斯特鲁普

C++之父Bjarne Stroustrup的经典著作《C++程序设计:原理与实践(原书第2版)》基于最新的C++11和C++14,广泛地介绍了程序设计的基本概念和技术,包括类型系统、算术运算、控制结构、错误处理等;介绍了从键盘和文件获取数值和文本数据的方法以及以图形化方式表示数值数据、文本和几何图形;介绍了C++标准库中的容器(如向量、列表、映射)和算法(如排序、查找和内积)的设计和使用。同时还对C++思想和历史进行了详细的讨论,很好地拓宽了读者的视野。为方便读者循序渐进地学习,加上篇幅所限,《C++程序设计:原理与实践(原书第2版)》分为基础篇和进阶篇两册出版,基础篇包括第1~11章、第17~19章和附录A、C,进阶篇包括第12~16章、第20~27章和附录B、D、E。本书是基础篇。

book

C++程序设计语言(第4部分:标准库)(原书第4版)

by 本贾尼 斯特劳斯特鲁普

作为C++语言的发明者和主要维护者,Bjarne Stroustrup在撰写本书时绝不仅仅满足于阐明语法和知识点本身。他试图向读者揭示各个语言功能的设计初衷,以及他对各种制约因素是如何考虑并妥协的。对于大多数读者来说,这种视角新奇而有趣。他们不再只是被动的学习者,在知道了“是什么”和“为什么”之后,还可以大胆地揣测“C++语言接下来该如何继续发展”。不得不说,这是本书与其他C++书籍的最大区别。作者在写作中融入了很多自己的工程实践经验。学习程序设计语言与学习文化课有很大的不同。设计程序的过程是一门艺术,程序语言只是完成艺术作品所需的工具。举个例子来说,由于各种各样的原因,在C++中存在一些语言特性,它们的功能和作用非常类似。那么这些特性之间是何关系?在遇到某类实际问题时应该如何聪明地选择?本书很好地回答了此类问题。

book

C++语言导学(原书第2版)

by 本贾尼 斯特劳斯特鲁普

本书简洁、自成体系,包含C++ 语言大多数主要特性和标准库组件。当然,这些并未深入介绍,而是给予程序员一个有意义的语言概述、一些关键的例子以及起步阶段的实用帮助。本书的目标不是教你如何编程,它也不可能是你精通C++ 的唯一资源。但是,如果你是一名C 或C++ 程序员,希望更加熟悉现在的C++ 语言,或者你是一名精通其他语言的程序员,希望获得有关现代C++ 语言本质和优点的精确描述,本书是最优选择。