1. 文件的创建
使用#define宏进行头文件重复include保护
2. 文件命名(命名尽量不要使用缩写,具有描述性)
文件命名使用下划线;(小写)
类型命名使用驼峰法;
普通变量使用下划线;
类数据成员使用和普通变量相同的下划线;
常量:const KTableName 驼峰;
函数命名: 驼峰法;
枚举命名规范:enum UrlTableErrors{
kOK=0,
kErrorOutOfMemory,
kErrorMalformedInput,
};
宏命名:MY_MACRO_THAT_SCARES_SMALL_CHILDREN
命名空间;命名独特不冲突即可,不要使用无意义的类和类静态成员,不修改约定俗成的namespace std
类:
构造函数中不要使用虚函数,无法在派生类里初始化
构造函数使用explicit防止隐式类型转换;
注意:
组合:将对象包含到其他对象实现代码复用的方式,体现的是has-a关系,即一个对象拥有了另一个对象;
继承:通过创建新类来扩展现有类,体现的是is-a关系,即一个类是另一个类的子类;
override和final:
override表示重写基类中的虚函数,final表示一个类或方法不允许被继承或重写
对于纯方法类(只包含纯虚函数的类),通常以interface作为接口
函数:
函数参数顺序:输入参数在前,能用const就用const,输出参数在后。引用参数最好使用const,如果有改变的可能,使用指针更加直白;
函数如果超过40行就要考虑能不能进一步分割
使用模板函数和复杂返回类型时,常用类型后置
注释:
文件开头有版权注释(为了开源和负责)
类注释,让读者知道干了啥
不要的注释:代码已经体现的
格式:
一行80个,不要超过120,正常缩进2个返回类型和函数名通常在一行
tips:
静态变量和全局变量要慎重使用,明确构造和析构顺序
采用modern C++
auto
nullptr
const,constptr
前置自增、自减
能使用只能指针,尽量使用智能指针
指针的传递代表所有权的交接,想清楚谁拥有对象的生命周期
RTTI运行时类型转换 dynamic_cast<**>能不用就不要使用
注释:
智能指针:常见的智能指针包含以下几种
std::unique_ptr、std::shared_ptr、std::weak_ptr
std::unique_ptr表示对对象的独占所有权,即同一时间只能有std::unique_ptr指向某一对象
std::shared_ptr表示对对象的共有所有权,即可以有多个std::shared_ptr指向同一个对象
std::weak_ptr通常与std::shared_ptr配合使用,用一个弱引用,reset来解决std::shared_ptr之间的循环引用问题
原文出处:
仅用作学习记录,侵权请联系