重读了一下《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. 声明顺序

  • 在类中使用特定的声明顺序: publicprivate 之前, 成员函数在数据成员 (变量) 前;
  • 类的访问控制区段的声明顺序依次为: 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)