文档介绍:C++编程规范
排版:
程序采用缩进风格编写,缩进的空格数为4个,不使用TAB键;程序块的分界符应个独占一行并且位于同一列,同时与引用它们的语句左对齐;
if,for,do,while,case,switch,default等语句各自
设计高扇入、合理扇出(小于7)的函数;
函数调用深度不能大于5;
函数参数个数应小于等于5个;
禁止编写变参函数;
避免函数中不必要语句,防止程序中的垃圾代码;
检查函数所有非参数输入的有效性,如数据文件、公共变量等;
函数的返回值要清楚、明了,让使用者不容易忽视错误情况;
if语句尽量加上else分支,对没有else分支的语句要小心对待;
switch语句必须有default分支;
重载运算符要保持自然语义;
如果函数不改变状态,则必须声明为const函数;
基本数据类型的输入参数,优先传值;
非基本类型的输入参数,优先传const引用;
输出参数,优先传引用;
宏:
用宏定义表达式时,要使用完备的括号;
使用宏时,不允许参数发生变化;
尽量减少宏的使用,使用const来定义常量,使用模板函数或内联函数来取代函数型宏;
模板:
不要使用全局变量,如果确有需要,可以使用单件模式;
独立编译模块的外部接口禁止返回申请的内存;
独立编译模块的外部接口禁止抛出异常;
与外部模块通信时使用低级数据类型,模块内部接口通信应使用高级数据类型;
头文件:
头文件必须自足,也即此头文件已包含了所有其依赖的文件;
禁止包含不需要的文件;
头文件必须有防止重复展开的宏;
头文件中不允许定义有链接的实体;
名字空间:
类型和非成员函数接口如果是协同工作的则放在同一个名字空间中,否则放在不同的名字空间中;
禁止不同名字空间的对象有初始化依赖关系;
禁止在头文件中使用using namespace 指令;
禁止在#include之前使用using namespace 指令;
类:
明确的定义类的类型:数据值类,基类;
禁止继承没有设计为基类的类;
多用组合,少用继承;
基类析构函数只能是公用虚函数或保护非虚函数;
一个类一个清晰的目的,不要写面面俱到的巨大的类;
在构造函数中初始化所有数据成员;
在构造函数中申请资源,在析构函数中释放资源;
将数据成员设为私有,C风格的结构体不受此限制;
禁止返回内部数据指针;
禁止在构造和析构函数中调用虚函数;
如果提供了析构函数则同时提供拷贝函数或显式禁止拷贝函数;
显式地启用或者禁止复制;
扩展功能时优先添加非成员非友员函数;
防止切片,考虑使用Clone代替拷贝操作;
考虑使用NVI;
考虑使用pimpl惯用法;
STL:
优先使用vector;
优先使用push_back来扩展序列;
在容器中只存放值,引用计数的智能指针或普通指针;
优先使用容器自带操作,使用惯用法;
考虑使用算法代替手工编写的循环;
使用迭代访问代替其它遍历容器方式;
算法和比较器的参数优先使用函数对象;
错误处理:
使用异常来报告错误;
通过值抛出异常,通过引用捕获异常;
保证所有的异常都得到了处理;
禁止使用函数异常声明;
函数必须提供强保证:保证回到初始状态或是到达操