C++ 编程规范 101




2019年夏



组织和策略问题

第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保护符

#ifndef FILE_NAME_H
#def FILE_NAME_H
...
#endif

函数与操作符

第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进行mencpy或者memcmp

第97条:不要使用联合{union}重新解释表示方式

第98条: 不要使用可变长参数{…}

第99条: 不要使用失效对象,不要使用不安全函数

第100条: 不要多态的处理数组


一个人的常量可能是另一个人的变量 .
任何规则都有例外 包括以上所有的规则,量子通讯的绝对安全也破灭了
代码编写扁平化
为什么叫C++而不叫++C:因为先有的C,后有C++
KISS原则