Google 开源项目风格指南(C++)
重读了一下《Google开源项目风格指南》,发现又有新的收获。这篇文章对编码规范的阐述还是算比较全面的,十分值得学习一下。
1. 头文件
1.1 头文件依赖
能用前置声明的地方尽量不使用 #include。
1.2. 内联函数
只有当函数只有 10 行甚至更少时才将其定义为内联函数。
1.3. 函数参数的顺序
定义函数时, 参数顺序依次为: 输入参数, 然后是输出参数。
输入参数一般传值或传 const 引用, 输出参数或输入/输出参数则是非 -const 指针。
输入/输出两用参数则可以有所变通,不需要严格遵守该条规则。
2. 作用域
2.1. 嵌套类
不要将嵌套类定义成公有, 除非它们是接口的一部分。比如,嵌套类含有某些方法的一组选项。
2.2. 非成员函数、静态成员函数和全局函数
使用静态成员函数或名字空间内的非成员函数,尽量不要用裸的全局函数。
2.3. 局部变量
将函数变量尽可能置于最小作用域内,并在变量声明时进行初始化。
3. 类
3.1. 显式构造函数
对单个参数的构造函数使用 C++ 关键字 explicit,防止同隐式转换混淆。
3.2. 拷贝构造函数
仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数; 大部分情况下都不需要, 此时应通过私有化 operator= 和 TypeName(const TypeName&) 构造函数禁止对象拷贝。
3.3. 结构体 VS. 类
仅当只有数据时使用 struct,其它一概使用 class。
3.4. 继承
优先使用组合,而非继承
3.5. 存取控制
将 所有 数据成员声明为 private ,并根据需要提供相应的存取函数。例如,名为 foo 的变量,提供读取函数 foo(),或者设置函数 set_foo()。
3.6. 声明顺序
- 在类中使用特定的声明顺序:
public在private之前, 成员函数在数据成员 (变量) 前; - 类的访问控制区段的声明顺序依次为:
public:,protected:,private:。 如果某区段没内容, 可以不声明。 - 每个区段内的声明通常按以下顺序:
typedefs和枚举- 常量
- 构造函数
- 析构函数
- 成员函数, 含静态成员函数
- 数据成员, 含静态数据成员
3.7. 编写简短函数
倾向编写简短,凝练的函数,函数不要超过 40 行。
4. 其他 C++ 特性
4.1. 类型转换
不要使用 C 风格类型转换. 而应该使用 C++ 风格。
- 用
static_cast替代 C 风格的值转换, 或某个类指针需要明确的向上转换为父类指针时。 - 用
const_cast去掉const限定符。 - 用
reinterpret_cast指针类型和整型或其它指针之间进行不安全的相互转换。仅在你对所做一切了然于心时使用。
4.2. const 的使用
强烈建议你在任何可能的情况下都要使用 const。
4.3. sizeof
尽可能用 sizeof(varname) 代替 sizeof(type)。