1. 让自己习惯C++  Accustoming Yourselfe to C++

01. 视C++为一个语言联邦  View C++ as a federation of languages

C++并不是一个带有一组守则的一体语言,它是由四个次语言(C、Object-Oriented C++、Template C++、STL)组成的联邦政府,每个次语言都有自己的规约。C++高效编程守则视状况而变化,取决于你使用C++的哪一个部分。

02. 尽量以const, enum, inline替换#define  Prefer consts, enums, and inlines to #defines

宁可以编译器替换预处理器。#define不被视为语言的一部分,编译器无法看到。对于单纯常量,最好以const对象或enum替换#define;对于形似函数的宏,最好改用inline函数替换#define。

03. 尽可能使用const  Use const whenever possible

如果关键字const出现在星号左边,表示被指物是常量(const位于类型之前和位于类型之后效果完全一样);如果出现在星号右边表示自身是常量;如果出现在星号两边,表示被指物和指针两者都是常量。

const最具威力的用法是面对函数声明时的应用。在一个函数声明式内,const可以和函数返回值、各参数、函数自身产生关联。令函数返回一个常量值,往往可以降低因客户错误而造成的意外,而又不至于放弃安全性和高效性。将const实施于成员函数的目的,是为了确认该成员函数可作用于const对象身上。将某些东西声明为const可帮助编译器侦测出错误用法。

当const和non-const成员函数有着实质等价的实现时,令non-const版本调用const版本可避免代码重复。

04. 确定对象被使用前已先被初始化  Make sure that objects are initialized before they're used

为内置型对象进行手工初始化,因为C++不保证初始化它们。

构造函数最好使用成员初值列表,而不要在构造函数本体内使用赋值操作。初值列表列出的成员变量,其排列次序应该和它们在class 中的声明次序相同。

为避免“跨编译单元之初始化次序”问题,请以local static对象替换non-local static对象。

2. 构造/析构/赋值运算  Constructors, Destructors, and Assignment Operatorss

05. 了解C++默默编写并调用哪些函数  Know what funtions C++ silently writes and calls

编译器会自动为class创建default构造函数、copy构造函数、copy assignment操作符,以及析构函数。

06. 若不想使用编译器自动生成的函数,就该明确拒绝  Explicitly disallow the use of compiler-generated functions you do not want

为驳回编译器自动提供的机能,可将相应的成员函数声明为private并且不予实现。

C++11起,可以使用=delete禁止调用某一函数。

07. 为多态基类声明virtual析构函数  Declare destructors virtual in polymorphic base classes

polymorphic(带多态性质的)base classe应该声明一个virtual析构函数。如果class带有任何virtual函数,它就应该拥有一个virtual析构函数。

class的设计目的如果不是作为base class使用,或不是为了具备多态性,就不该声明virtual析构函数。

08. 别让异常逃离析构函数  Prevent exceptions from leaving destructors

析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。

如果某个操作可能在失败时抛出异常,而又存在某种需要必须处理该异常,那么这个异常必须来自析构函数以外的某个函数。即,class应该提供一个普通函数(而非在析构函数中)执行该操作。

09. 绝不在构造和析构过程中调用virtual函数  Never call virtual functions during construction or destruction

10. 令operator=返回一个reference to *this  Have assignment operators return a reference to *this

11. 在operator=中处理“自我赋值”  Handle assignment to self in operator=

12. 复制对象时勿忘其每一个成分  Copy all parts of an object

3. 资源管理  Resource Management

13. 以对象管理资源  Use objects to manage resources

14. 在资源管理类中小心coping行为  Think carefully about copying behavior in resource-managing classes

15. 在资源管理类中提供对原始资源的访问  Provide access to raw resources in resource-managing classes

16. 成对使用new和delete时要采取相同形式  Use the same form in corresponding uses of new and delete

17. 以独立语句将newed对象置入智能指针  Store newed objects in smart pointers in standalone statements.

4. 设计与声明  Designs and Declarations

18. 让接口容易被正确使用,不易被误用  Make interfaces easy to use correctly and hard to use incorrectly

19. 设计class犹如设计type  Treat class design as type design

20. 宁以pass-by-reference-to-const替换pass-by-value  Prefer pass-by-reference-to-const to pass-by-value

21. 必须返回对象时,别妄想返回其reference  Don't try to return a reference when you must return an object

22. 将成员变量声明为private  Declare data members private

23. 宁以non-member、non-friend替换member函数  Prefer non-member non-friend functions to member functions

24. 若所有参数皆需类型转换,请为此采用non-member函数  Declare non-member functions when type conversions should apply to all parameters

25. 考虑写出一个不抛出异常的swap函数  Consider support for a non-throwing swap

5. 实现  Implementations

26. 尽可能延后变量定义式的出现时间  Postpone variable definitions as long as possible

27. 尽量少做转型动作  Minimize casting

28. 避免返回handles指向对象内部成分  Avoid returning "handles" to object internals

29. 为“异常安全”而努力是值得的  Strive for exception-safe code

30. 透彻了解inlining的里里外外  Understand the ins and outs of inlining

31. 将文件间的编译依存关系降至最低  Minimize compilation dependencies between files

6. 继承与面向对象设计  Inheritance and Object-Oriented Design

32. 确定你的public继承塑模出is-a关系  Make sure public inheritance models "is-a"

33. 避免遮掩继承而来的名称  Avoid hiding inherited names

34. 区分接口继承和实现继承  Differentiate between inheritance of interface and inheritance of implementation

35. 考虑virtual函数以外的其他选择  Consider alternative to virtual functions

36. 绝不重新定义继承而来的non-virtual函数  Never redefine an inherited non-virtual function

37. 绝不重新定义继承而来的缺省参数值  Never redefine a function's inherited default parameter value

38. 通过复合塑模出has-a或“根据某物实现出”  Model "has-a" or "is-implemented-in-terms-of" through composition

39. 明智而审慎地使用private继承  Use private inheritance judiciously

40. 明智而审慎地使用多重继承  Use multiple inheritance judiciously

7. 模板与泛型编程  Templates and Generic Programming

41. 了解隐式接口和编译期多态  Understand implicit interfaces and compile-time polymorphism

42. 了解typename的双重意义  Understand the two meanings of typename

43. 学习处理模板化基类内的名称 Know how to access names in templatized base classs

44. 将与参数无关的代码抽离templates  Factor parameter-independent code out of templates

45. 运用成员函数模板接受所有兼容类型  Use member function templates to accept "all compatible types"

46. 需要类型转换时请为模板定义非成员函数  Define non-member functions inside templates when type conversions are desired

47. 请使用traits classes表现类型信息  Use traits classes for information about types

48. 认为template元编程  Be aware of template metaprogramming

8. 定制new和delete  Customizing new and delete

49. 了解new-handler的行为  Understand the behavior of the new-handler

50. 了解new和delete的合理替换时机  Understand when it makes sense to replace new and delete

51. 编写new和delete时需固守常规  Adhere to convention when writing new and delete

52. 写了placement new也要写placement delete  Write placement delete if you write placement new

9. 杂项讨论  Miscellany

53. 不要轻忽编译器的警告  Pay attention to compiler warnings

54. 让自己熟悉包括TR1在内的标准程序库  Familiarize yourself with the standard library, including TR1

55. 让自己熟悉Boost  Familiarize yourself with Boost

高效C++ Effective C++相关推荐

  1. 好文章,转的Java重构

    本文转于:http://hi.baidu.com/hjysuccess/blog/item/a177e718e9a7ac0535fa4186.html java代码重构 2007-07-21 13:5 ...

  2. 标注成本降低5倍!LaserMix:通用半监督LiDAR点云分割框架(新加坡南洋理工大学)...

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 后台回复[LMix]获取论文! 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 后台回 ...

  3. node+ejs实现服务端渲染SSR

    一.服务端渲染SSR 1.什么是客户端渲染和服务端渲染? 客户端渲染:客户端向服务端请求HTML页面,后端不返回完整的 HTML页面,浏览器解析HTML页面过程中如果遇到ajax数据请求,会向服务端请 ...

  4. 不要写完代码就束之高阁,适当地优化代码结构,能够为以后的开发带来许多方便,这《重构:改善既有代码的设计》就向你介绍了这方面的技巧,说得非常详细。...

    "不要写完代码就束之高阁,适当地优化代码结构,能够为以后的开发带来许多方便,这<重构:改善既有代码的设计>就向你介绍了这方面的技巧,说得非常详细." "程序几 ...

  5. 重构(Refactoring)

    重构(Refactoring)就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性. 也许有人会问,为什么不在项目开始时多 ...

  6. 关于代码重构的一些笔记

    代码重构 代码重构(英语:Code refactoring)重构就是在不改变软件系统外部行为的前提下,改善它的内部结构. 软件重构需要借助工具完成,重构工具能够修改代码同时修改所有引用该代码的地方.在 ...

  7. 浅谈 C++ 元编程

    随着 C++ 11/14/17 标准的不断更新,C++ 语言得到了极大的完善和补充.元编程作为一种新兴的编程方式,受到了越来越多的广泛关注.结合已有文献和个人实践,对有关 C++ 元编程进行了系统的分 ...

  8. 如何更高效的编写Go代码 Effective Go

    因为最近在编写安全扫描器,为更好,更高效的完成代码的编写,笔者认为有必要对于官方建议进行学习,奈何官方为存英文内容看起来有些吃力,所以搜索整理出Effective Go的中文版本作为参考. 以下内容整 ...

  9. GPU Gems1 - 1 用物理模型进行高效的水模拟(Effective Water Simulation from Physical Models)

    该读书笔记大多内容参照了大神浅墨的该篇文章https://zhuanlan.zhihu.com/p/35974789 本章介绍了一种在GPU中模拟和渲染大的水体的系统.它把基本网格的集合波动于动态发现 ...

  10. 高效的java异常(Effective Java Exceptions)

    摘要 Java开发人员可以做出的最重要的架构决策之一是如何使用Java异常模型.Java异常一直是社区争论的主题. 有些人认为Java语言中的checked(受检)异常是一个失败的实验. 本文认为,错 ...

最新文章

  1. 当红网络财富人生 用科技狂澜财富成为首富
  2. pythonfor循环break_python 中 for 循环 if循环 break
  3. 原创jquery插件treeTable(转)
  4. Map集合中的一些具体方法的体现
  5. SpringBoot创建SpringBoot项目以及启动器讲解
  6. 组图:2000悉尼奥运会
  7. 袁亚湘:愿为数学做更多
  8. 【Flink】Flink Committing offsets to Kafka takes longer than the checkpoint interval
  9. 管理系统页面脚手架(一)
  10. 2019死磕java面试题_死磕 java同步系列之开篇
  11. 001_深度剖析什么是 SLI、SLO和SLA?
  12. 2038年问题 php,php strtotime() mktime() 的2038年问题 Y2K38漏洞
  13. 3.OSPF协议及链路状态算法
  14. 关于JM8.6中MAX_LIST_SIZE值的选取
  15. 微信公众号在调用扫一扫功能时,一维码(条形码)在直接返回结果时会在结果前带上EAN_8, EAN_13, CODE_25, CODE_39, CODE_128, UPC_A, UPC_E...
  16. html空格折叠原因,html – 使用Bootstrap列折叠空白
  17. 系统测试包含哪几部分?
  18. 如何看待爱迪生和特斯拉的直流交流电之争——两种模式的企业管理
  19. python椭圆拟合_椭圆拟合(python)
  20. 全球定位实景导航 iOS实用应用周排行

热门文章

  1. doom3 entitydef实体定义
  2. Redis 实例:开发一个Spring Redis应用程序
  3. Flash 特效原理 震动效果
  4. Ubuntu进行apt-get出现Package xxx is not available,but is referred to by another package错误
  5. 什么是缓存雪崩、击穿、穿透?
  6. 51ditu、清华地图以及Google地图
  7. FlashFXP 便携版,U盘版,真正绿色
  8. ftp工具绿色版,四款好用的绿色版ftp工具
  9. 读书笔记:Google软件测试之道
  10. 云队友丨如何长久、持续且稳定的做一件事?