C++ 编程规范

作者: 赵者也 | 来源:发表于2017-07-16 21:07 被阅读13次

组织

  1. 不要拘泥于小节
  2. 在高警告级别干净利落地进行编译
  3. 使用自动构建系统
  4. 适用版本控制系统
  5. 在代码审查上投入

设计

  1. 一个实体应该只有一个紧凑的职责
  2. 正确、简单和清晰第一
  3. 编程中用该知道何时和如何考虑可伸缩性
  4. 不要进行不成熟的优化
  5. 不要进行不成熟的劣化
  6. 尽量减少全局和共享数据
  7. 隐藏信息
  8. 懂得何时和如何进行并发性编程
  9. 确保资源为对象所拥有。使用显式的 RAII 和智能指针

编程

  1. 宁要编译时和连接时的错误,也不要运行时错误
  2. 积极使用 const
  3. 避免使用宏
  4. 避免使用“魔数”
  5. 尽可能局部地声明变量
  6. 总是初始化变量
  7. 避免函数过长,避免嵌套过深
  8. 避免跨编译单元的初始化依赖
  9. 尽量减少定义性依赖。避免循环依赖
  10. 头文件应该自给自足
  11. 总是编写内部 #include 保护符,决不要编写外部 #include 保护符

函数与操作符

  1. 正确地选择通过值、(智能)指针或者引用传递参数
  2. 保持重载操作符的自然语义
  3. 优先使用算术操作符和赋值操作符的标准形式
  4. 优先使用 ++ 和 -- 的标准形式。优先调用前缀形式
  5. 考虑重载以避免隐含类型转换
  6. 避免重载 &&、|| 或 ,(逗号)
  7. 不要编写依赖于函数参数求值顺序的代码

类的设计与继承

  1. 弄清所要编写的是那种类
  2. 用小类代替巨类
  3. 用组合代替继承
  4. 避免从并非要设计成基类的类中继承
  5. 优先提供抽象接口
  6. 公用继承即可替换性。继承,不是为了重用,而是为了被重用
  7. 实施安全的改写
  8. 考虑将虚拟函数声明为非公用的,将公用函数声明为非虚拟的
  9. 要避免提供隐式转换
  10. 将数据成员设为私有的,无行为的聚集(C 语言形式的 struct)除外
  11. 不要公开内部数据
  12. 明智地使用 Pimpl
  13. 优先编写非成员非友元函数
  14. 总是一起提供 new 和 delete
  15. 如果提供类专门的 new,应该提供所有标准形式(普通、就地和不抛出)

构造、析构与复制

  1. 以同样的顺序定义和初始化成员变量
  2. 在构造函数中用初始化代替赋值
  3. 避免在构造函数和析构函数中调用虚拟函数
  4. 将基类析构函数设为公用且虚拟的,或者保护且非虚拟的
  5. 析构函数、释放和交换绝对不能失败
  6. 一致地进行复制和销毁
  7. 显式地启用或者禁止复制
  8. 避免切片。在基类中考虑用克隆代替复制
  9. 使用赋值的标准形式
  10. 只要可行,就提供不会失败的 swap (而且要正确地提供)

名字空间与模块

  1. 将类型及其非成员函数接口置于同一名字空间中
  2. 应该将类型和函数分别置于不同的名字空间中,除非有意想让它们一起工作
  3. 不要在头文件中或者 #include 之前编写名字空间 using
  4. 要避免在不同的模块中分配和释放内存
  5. 不要在头文件中定义具有链接的实体
  6. 不要允许异常跨越模块边界传播
  7. 在模块的接口中使用具有良好可移植性的类型

模板与泛型

  1. 理智地结合静态多态性和动态多态性
  2. 有意地进行显式自定义
  3. 不要特化函数模板
  4. 不要无意地编写不通用的代码

错误处理与异常

  1. 广泛地使用断言记录内部假设和不变式
  2. 建立合理的错误处理策略,并严格遵守
  3. 区别错误与非错误
  4. 设计和编写错误安全代码
  5. 优先使用异常报告错误
  6. 通过值抛出,通过引用捕获
  7. 正确地报告、处理和转换错误
  8. 避免使用异常规范

STL: 容器

  1. 默认情况下使用 vector。否则选择其它合适的容器。
  2. 用 vector 和 string 取代数组。
  3. 使用 vector(以及 string::c_str)来和非 C++ API 交换数据。
  4. 仅在容器中存储值和智能指针。
  5. 与其它方法相比,要尽量使用 push_back 来扩大容器。
  6. 与单元素操作相比,要尽量使用区间操作。
  7. 使用公认的惯用法来真正地缩小容量以及真正地删除元素。

STL算法(STL: Algorithms)

  1. 使用一个带检查的(checked)STL 实现。
  2. 与手工编写的循环相比,要尽量调用 STL 算法。
  3. 使用正确的 STL 查找算法。
  4. 使用正确的 STL 排序算法。
  5. 使 predicate 成为纯函数(pure function)。
  6. 在用作算法和比较器(comparer)时,要优先用函数对象来代替函数。
  7. 正确地编写函数对象(Function Object)。

类型安全性(Type Safety)

  1. 避免类型选择(type switching);尽量使用多态。
  2. 依赖于对象类型,而不要依赖于对象的表示方法。
  3. 避免使用 reinterpret_cast。
  4. 避免用 static_cast 来强制转换指针类型。
  5. 避免强制去除 const。
  6. 不要用 C 风格的强制类型转换。
  7. 不要对非 POD 类型使用 memcpy 或 memcmp。
  8. 不要用 union 来重新解释数据。
  9. 不要使用 varargs(省略号)。
  10. 不要使用无效的对象。不要使用不安全的函数。
  11. 不要以多态方式处理数组。

相关文章

  • 极客班第一周学习笔记

    初识C++ C++是在C之上基于对象,面向对象的编程语言。c++相比c在编程上更加模块化,具象化。 C++代码规范...

  • C++ 编程规范

    C++ 编程规范 这是一本 由两位世界顶级专家联袂巨献,适合所有层次 C++程序员 的 C++ 界20年集大成之作...

  • C++ 编程规范

    组织 不要拘泥于小节 在高警告级别干净利落地进行编译 使用自动构建系统 适用版本控制系统 在代码审查上投入 设计 ...

  • C++编程规范

    序 C++用法很多,包容性也比较强。一个C++的工程可能包含了各种各样没见过的用法。本篇内容主要是参照谷歌C++标...

  • C++编程规范

    背景 C++是很多项目的主要开发语言。项目一般是多人开发,而每个人的编码风格一般各有不同。如果没有一套C++的编程...

  • 我使用的编程规范

    我在使用的C、Objective-C、C++编编程时,有一套自己的规范,本文是我规范的基本内容,有些规范,比如空格...

  • C++编程规范总结

    引言 C++ 是一门十分复杂并且威力强大的语言,使用这门语言的时候我们应该有所节制,绝对的自由意味着混乱。 1.规...

  • C++面向对象高级编程(上)笔记

    1.培养规范、大气的编程习惯 C++的学习过程可以分为C++语言与C++标准库两个部分,不必太在乎版本。标准库一般...

  • 编程规范 - 头文件

    【摘自《 Google C++ 编程规范》】 所有头文件都应该使用 #define 防止头文件被多重包含(mult...

  • C++入门03 -- 类、class、struct、对象、thi

    C++的编程规范 变量名的规范参考:全局变量:g_xxx;成员变量:m_xxx;静态变量:s_xxx;常量:c_x...

网友评论

    本文标题:C++ 编程规范

    本文链接:https://www.haomeiwen.com/subject/rkjxkxtx.html