← 返回首页
C++ 编码规范
.h 与 .cpp 文件组织
#ifndef THIS_IS_A_HEADER_
#define THIS_IS_A_HEADER_
#endif // THIS_IS_A_HEADER_
头文件中尽量 include 具体类型,避免前置声明(前置声明仅在只使用指针时可用)。
.cpp 文件的 include 顺序:
#include "this_is_a_header.h" // 关联头文件
#include <stdio.h> // C 库文件
#include <string> // C++ 库文件
#include "glog.h" // 其他项目头文件
#include "same_project_header.h" // 本项目其他头文件
命名规则
- 通用:命名有描述性,尽量少用缩写
- 文件:
my_useful_class.h(下划线连接)
- 类型:CamelCase —
MyUsefulClass
- 普通变量:
table_name
- 类数据成员:
table_name_
- 常量:
const kTableName
- 函数:CamelCase —
ValidateFuncName()
- 枚举:
kOK、kErrorOutOfMemory
- 宏:
MY_MACRO_THAT_SCARES
- 命名空间:独特不冲突即可
类设计
- 构造函数不要调用虚函数(不会调到派生类版本),及时抛出异常
- 使用 explicit 防止隐式类型转换
- 拷贝构造、赋值构造、移动构造、移动赋值成套使用
- 组合优于继承,has-a 比 is-a 更灵活
- 使用 override、final 关键字标明继承方法
- 尽量不使用多继承
- 纯方法类建议使用 Interface 后缀
函数规范
- 参数顺序:输入在前(能用 const 就 const),输出在后
- 引用参数最好都加 const,如需修改使用指针更直白
- 函数超过 40 行考虑分割
- 可用类型后置:
auto foo(int x) -> int;
注释
- 自注释代码,简洁易懂
- 文件开头有版权注释
- 类注释说明功能
- TODO(someone): someone will do it
- 弃用标注:
//DEPRECATED
格式
- 一行 80 字符,最长不超过 120
- 缩进使用 2 个空格
- 返回类型和函数名在同一行
Modern C++ Tips
- 优先使用 auto、nullptr、const/constexpr
- 前置自增/自减
- 尽量使用智能指针
- 指针传递代表所有权交接
- 避免 RTTI(dynamic_cast),寻找替代方案
- 慎用静态变量和全局变量,注意构造/析构顺序