C++编程规范-101条规则准则与最佳实践
C++编程规范-101条规则准则与最佳实践
| 章 | 节 |
|---|---|
| 组织和策略问题 | 0.不要拘泥于小节 |
| 1.在高警告级别干净利落地进行编译 | |
| 2.使用自动构建系统 | |
| 3. 使用版本控制系统 | |
| 4. 在代码审查上投入 | |
| 设计风格 | 5. 一个实体应该只有一个紧凑的职责 |
| 6. 正确、简单和清晰第一 | |
| 7. 编程中应知道何时和如何考虑可伸缩性 | |
| 8. 不要进行不成熟的优化 | |
| 9. 不要进行不成熟的劣化 | |
| 10. 尽量减少全局和共享数据 | |
| 11. 隐藏信息 | |
| 12. 懂得何时和如何进行并发性编程 | |
| 13. 确保资源为对象所拥有。使用显式的RAII和智能指针 | |
| 编程风格 | 14. 宁要编译时和连接时错误,也不要运行时错误 |
| 15. 积极使用const | |
| 16. 避免使用宏 | |
| 17. 避免使用”魔数” | |
| 18. 尽可能局部地声明变量 | |
| 19. 总是初始化变量 | |
| 20. 避免函数过长,避免嵌套过深 | |
| 21. 避免跨编译单元的初始化依赖 | |
| 22. 尽量减少定义性依赖。避免循环依赖 | |
| 23. 头文件应该自给自足 | |
| 24. 总是编写内部#include保护符,绝不要编写外部#include保护符 | |
| 函数与操作符 | 25. 正确地选择通过值,(只能)指针或者引用传递参数 |
| 26. 保护重载操作符的自然语义 | |
| 27. 优先使用算术操作符和赋值操作符的标准形式 | |
| 28. 优先使用++和–的标准形式。优先调用前缀形式 | |
| 29. 考虑重载以避免隐含类型转换 | |
| 30. 避免重载&&,||或,(逗号) | |
| 31. 不要编写依赖于函数参数求值顺序的代码 | |
| 类的设计和继承 | 32. 弄清所要编写的是哪种类 |
| 33. 用小类代替巨类 | |
| 34. 用组合代替继承 | |
| 35. 避免从并非必要设计成基类的类中继承 | |
| 36. 优先提供抽象接口 | |
| 37. 公用继承即可替换性。继承,不是为了重用,而是为了被重用 | |
| 38. 实施安全的改写 | |
| 39. 考虑将虚拟函数声明成非公用的,将公用函数声明为非虚拟的 | |
| 40. 要避免提供隐式转换 | |
| 41. 将数据成员设为私有的,无行为的聚集(C语言形式的struct)除外 | |
| 42. 不要公开内部数据 | |
| 43. 明智地使用Pimpl | |
| 44. 优先编写非成员非友元函数 | |
| 45. 总是一起提供new和delete | |
| 46. 如果提供类专门的new,应该提供所有的标准形式(普通,就地和不抛出) | |
| 构造、析构和复制 | 47. 以同样的顺序定义和初始化成员变量 |
| 48. 在构造函数中使用初始化代替赋值 | |
| 49. 避免在构造函数和析构函数中调用虚拟函数 | |
| 50. 将基类析构函数设为公共且虚拟的,或者保护且非虚拟的 | |
| 51. 析构函数、释放和交换绝对不能失败 | |
| 52. 一致地进行赋值和销毁 | |
| 53. 显式地弃用或者禁止复制 | |
| 54. 避免切片。在基类中考虑用克隆代替复制 | |
| 55. 使用赋值的标准形式 | |
| 56. 只要可行,就提供不会失败的swap(而且要正确地提供) | |
| 命名空间与模块 | 57. 将类型及其非成员函数接口置于同一名字空间中 |
| 58. 应该将类型和函数分别置于不同的名字空间中,除非有意想让它们一起工作 | |
| 59. 不要在头文件中或者#include之前编写名字空间using | |
| 60. 要避免在不同的模块中分配和释放内存 | |
| 61. 不要在头文件定义具有链接的实体 | |
| 62. 不要允许异常跨越边界传播 | |
| 63. 在模块的接口中使用具有良好可移植性的类型 | |
| 模板和泛型 | 64. 理智地结合静态多态性和动态多态性 |
| 65. 有意地进行显式自定义 | |
| 66. 不要特化函数模板 | |
| 67. 不要无意地编写不通用的代码 | |
| 错误处理与异常 | 68. 广泛地使用断言记录内部假设和不变式 |
| 69. 建立合理的错误处理策略,并严格遵守 | |
| 70. 区别错误和非错误 | |
| 71. 设计和编写错误安全代码 | |
| 72. 优先使用异常报告错误 | |
| 73. 通过值抛出,通过引用捕获 | |
| 74. 正确地报告、处理和转换错误 | |
| 75. 避免使用异常规范 | |
| 容器 | 76. 默认时使用vector。否则,选择其他合适的容器 |
| 77. 同vector和string代替数组 | |
| 78. 使用vector(和string::c_str())与非C++ API交换数据 | |
| 79. 在容器中只存储值和智能指针 | |
| 80. 用push_back代替其他扩展序列的方式 | |
| 81. 多用范围操作,少用单元素操作 | |
| 82. 使用公认的惯用法真正地压缩容量,真正地删除元素 | |
| 算法 | 83. 使用带检查的STL实现 |
| 84. 用算法调用代替手工编写的循环 | |
| 85. 使用正确的STL查找算法 | |
| 86. 使用正确的STL排序算法 | |
| 87. 使谓词称为纯函数 | |
| 88. 算法和比较器的参数应多用函数对象少用函数 | |
| 89. 正确编写函数对象 | |
| 类型安全 | 90. 避免使用类型分支,多使用多态 |
| 91. 依赖类型,而非其表示方式 | |
| 92. 避免使用reinterpret_cast | |
| 93. 避免对指针使用static_cast | |
| 94. 避免强制转换const | |
| 95. 不要使用C风格的强制转换 | |
| 96. 不要对非POD进行memcpy操作和memcmp操作 | |
| 97. 不要使用联合重新解释表示方式 | |
| 98. 不要使用可变长参数(…) | |
| 99. 不要使用失效对象。不要使用不安全函数 | |
| 100. 不要多态地处理数组 |
Comments
Comment plugin failed to load
Loading comment plugin