头文件
1、 define保护
头文件的命名应基于其所在项目源代码树的全路径。
2、 头文件依赖
使用前置声明(forward declaration),尽量减少.h文件中#include的数量。
能依赖声明的就不依赖定义。
3、 内联函数
只有当函数少于10行或更少时,才使用内联类型。
4、 -inl.h
复杂内联函数的定义,应放在-inl.h文件中。
5、 函数定义顺序
输入参数在前,输出参数在后。
6、 文件包含顺序
C库\C++库\其它库的.h\项目内的.h
命名空间
1、 命名空间
在.cc文件中推荐使用不具名的命名空间(unnamednamespaces).
不能在.h文件中使用不具名的命名空间。
2、 嵌套类(Nested class)
当公开嵌套类作为接口的一部分时,最好将嵌套类的声明置于命名空间之中。
3、 非成员函数(Nonmember)、静态成员函数(StaticMember)和全局函数(Global Functions)
使用命名空间中的非成员函数或静态成员函数,尽量不要使用全局函数。
4、 局部变量
将函数变量尽可能置于最小的作用域内,在声明变量时将其初始化。
5、 全局变量
class类型的区安监局变量是被禁止的,内建类型的全局变量是允许的,当然多线程代码中非常熟全局变量也是被禁止的。永远不要使用函数返回值初始化全局变量。
C++类
1、 构造函数的职责
构造函数中只进行那些没有实际意义的初始化,可能的话,使用Init()方法集中初始化为有意义的(non-trivial)数据。
2、 默认构造函数
如果类中定义了成员变量,没有提供其他构造函数,你需要定义一个默认构造函数。默认构造函数更适合于初始化对象,使对象内部状态(internal state)一致、有效。
3、 明确的构造函数
对但参数构造函数使用C++关键字explicit。
4、 拷贝构造函数
尽在代码中需要拷贝一个类对象的时候使用拷贝构造函数;不需要拷贝时应使用:DISALLOW_COPY_AND_ASSIGN
5、 结构体和类
仅当只有数据时使用struct,其它一概使用class。
6、 继承
使用组合通常比使用继承更适宜,如果使用继承的话,只使用公共继承。
7、 多重继承
真正需要用多重实现继承的时候非常少,只有当最多一个基类中含有实现,其他几类都是以Interface为后缀的纯接口类时才会使用多重继承。
8、 操作符重载
出少数特定环境外,不要重载操作符。
9、 存取控制
将数据成员私有化,并提供相关存取函数。
10、 声明次序
public在private之前,成员函数在数据成员前。
11、 编写短小的函数
智能指针和其他C++特性
1、 智能指针
如果确实需要使用智能指针的话,scoped_ptr完全可以胜任。在非常特殊的情况下,你应该只使用shared_ptr,任何情况下都不要使用auto_ptr。
2、 引用参数
按引用传递的参数必须加上const。
3、 函数重载
尽在输入类型不同、功能相同时使用重载函数(喊构造函数),不要使用函数重载模仿缺省函数参数。
4、 缺省参数
禁止使用缺省函数参数。
5、 变长数组和alloca
禁止使用变长数组和alloca,使用安全地分配器allocator。
6、 友元
允许合理使用友元类及友元函数。
7、 异常
不要使用C++异常。
8、 运行时类型识别(Run-Time Type Information, RTTI)
禁止使用RTTI.
9、 类型转换
使用static_cast<>()等C++的类型转化,不要使用int y = (int)x 或 int y = int(x);
10、 流(Stream)
只在记录日志时使用流。
11、 前置自增和自减(Preincrement and Predecrement)
对于迭代器和其他模板对象使用前缀形式(++i)的自增、自增运算符。
12、 const的使用
强烈建议你在任何可以使用的情况下都要使用const。
13、 整型
14、 64位下的可移植性
15、 预处理宏
使用宏时要谨慎,尽量以内联函数、枚举和常量代替之。
16、 0和NULL
整数用0,实数用0.0,指针用NULL,字符(串)用’\0’.
17、 sizeof (sizeof)
尽可能用sizeof(varname)代替sizeof(type).
18、 Boost库
只是用boost中被认可的库。
命名约定
1、 通用命名规则
函数命名、变量命名、文件命名应具有描述性,不要过度缩写,类型和变量应该是名词,函数名可以用“命令性”动词。
2、 文件命名:
文件名要全部小写,可以包含下划线(_)或短线(-)。
3、 类型命名
类型命名每个单词以大写 开头。
4、 变量命名
变量名一律小写,单词间以下划线相连,类的成员变量以下划线结尾。
5、 常量命名
在名称前加k。
6、 函数命名
普通函数大小写混合,存取函数要求与变量名匹配。
7、 命名空间
命名空进的名称是全小写的,其命名基于项目名称和目录结构。
8、 枚举命名
枚举值应全部大写,单词间以下划线相连。
9、 宏命名
10、 命名规则例外
代码注释
1、 注释风格(Comment Style)
风格要统一。
2、 文件注释(File Comment)
版权、许可版本、作者、内容
3、 类注释
每个类的定义要附着描述类的功能和用法的注释。
4、 TODO注释
对那些临时的、短期的解决方案,或已经够好但并不完美的代码使用TODO注释。
格式
1、 行长度
每一行代码字符数不超过80.
2、 空格还是制表位
只是用空格,每次缩进2个空格。