#define
<PROJECT>_<PATH>_FILE_H_
使用 前置声明(forward declarations) 尽量减少 .h 文件中 #include 的数量
头文件中用到类 File,但不需要访问 File 的声明
则头文件中只需 前置声明 class File;
无需 #include "file.h"
名称要求
次序
本项目头文件
C 系统文件
C++ 系统文件
其他库头文件
本项目内头文件
只有当函数只有 10 行甚至更少时,才会将其定义为 内联函数
所有的内联函数的定义应放在 .h 文件中
如果内联函数的定义比较短小、逻辑比较简单,其实现代码可以放在 .h 文件中
较复杂的内联函数也可以放到 .h 文件中,或将其分离到单独的 -inl.h 中
输入参数在前,输出参数在后
输入参数 一般 传值 或 常数引用(const references)
输出参数 或 输入/输出参数 为 非常数指针
提倡使用 不具名的命名空间(unnamed namespaces)
不要声明命名空间 std 下的任何内容,包括标准库类的 前置声明
命名空间将 **除文件包含、全局标识的声明/定义 以及 类的前置声明** 外的整个源文件封装起来
以同其他命名空间相区分
禁止使用 class 类型 的全局变量(包括 STL 的 string, vector 等等)
全局的 字符串常量,使用 C 风格 的字符串,而不要使用 STL 的字符串
const charkFrogSays[] = "ribbet";
构造函数中只进行那些没有实际意义的(trivial)初始化
可能的话,使用 Init() 方法 几种初始化 **有意义的(non-trivial)**数据
如果 定义了若干成员变量,但 没有其他构造函数,则自定义一个默认构造函数
对单参数构造函数使用 C++ 关键字 explicit
仅在代码中需要拷贝一个类对象的时候使用拷贝构造函数
不需要拷贝时,应使用 DISALLOW_COPY_AND_ASSIGN
避免编译器自动生成相应的 public 的拷贝构造函数
可能会是导致 性能问题 和 bugs 的根源,并且降低了 代码可读性(相比按引用传递,跟踪按值传递的对象更加困难)
#define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName&); \ void operator=(const TypeName&) class Foo { public: Foo(int f); ~Foo(); private: DISALLOW_COPY_AND_ASSIGN(Foo); };
foo_
、取值函数 foo()
、赋值函数 set_foo()
public:
==> protected:
==> private:
private:
块之后,作为类的最后部分函数形参表中,所有按引用传递的参数必须加上 const
void Foo(const string &in, string *out);
int64_t my_value = 0x123456789LL;
uint64_t my_mask = 3ULL << 48
函数命名、变量命名、文件命名应具有描述性,不要过度缩写
类型和变量 应该是名词,函数名 可以用"命令性"动词
- 每个单词以大写字母开头,不包含下划线
- 与变量名匹配 class MyClass { public: int num_entries() { return num_entries; } void set_num_entries(int num_entries) { num_entries_ = num_entries; } private: int num_entries_; };
- 每个单词以大写字母开头,不包含下划线
- 全部大写,单词间以下划线相连
default: assert(false);
.
或 箭头 ->
前后不要有空格*
或 地址操作符 &
后不要有空格&&
操作符总位于行尾public:
==> protected:
==> private:
,每次缩进 1 个空格