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条:避免使用异常规范
STL:容器
第76条:默认时使用vector。否则,选择其他合适的容器
第77条:用vector和string代替数组
第78条:使用vector(和string::c_str)与非C++API交换数据
第79条:在容器中只储存值和智能指针
第80条:用push_back代替其他扩展序列的方法
第81条:多用范围操作,少用单元素操作
第82条:使用公认的惯用法真正地压缩容量,真正地删除元素
STL:算法
第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操作或者mencmp操作
第97条:不要使用联合重新解释表达式
第98条:不要使用可变长参数(…)
第99条:不要使用失效对象(注意迭代器失效,特别是在插入元素后)。不要使用不安全函数
第100条:不要多态地处理数组