规则1.头文件依赖于前向申明
【什么是前向申明】
当我们在头文件中需要类的定义时,只需要申明class CLASSNAME就可以了,无需使用#include “CLASSNAME.h”【带来的优势】
较少文件依赖,节约编译时间
更加明确的类的依赖关系【规则】
尽可能多的使用前向申明
规则2.函数的参数顺序
【规则】
参数的申明顺序为,输入参数在前,输出参数在后
输入参数一般为传值和常数引用
输出参数或输入/输出参数一般为非常数指针【带来的优势】
通过位置明确函数参数的作用
利于代码的合并
规则3.头文件的包含顺序
【规则】
先包含类对应头文件
C系统头文件
C++系统头文件
其他库头文件
本项目内头文件
之间通过空格区分【带来的优势】
增加可读性
利于代码合并
规则4.局部类的初始化
- 【规则】
一个类的局部变量会默认做一次构造和析构,应注意避免多次的初始化与析构。
规则5.类的初始化
- 【规则】
注意类成员的初始化
类的初始化虽然很简单,但我发生很多程序员忘记做了,导致不可预知的问题
养成良好的类成员申明习惯
规则6.类的拷贝构造函数
- 【规则】
拷贝构造函数可以方便的帮助我们进行类的数据拷贝复制
并且编译器会默认为我们的类提供一个赋值操作符函数和拷贝构造函数。
但同时也会带来问题,注意禁用默认的拷贝构造和赋值函数
规则7.结构体和类
结构体和类的区别?
在C++中,struct和class可以起到同样的作用,唯一的区别是struct默认方法和成员是public的,class默认是private的。【规则】
我们约定仅当只有数据的时候使用struct,其他一般使用class。
另外struct也可以和class一样使用构造和析构函数对数据进行初始化和释放。
规则8.操作符重载
- 【规则】
操作符重载可以为我们的代码编写提供便利,但是也会使得我们的代码变得不够直观。
例如增加一个Equals方法比直接对==操作符重载要来的直观得多
因此我们一般不要对操作符进行重载,例如=符号的重载我们定义Equals或者Copy要更为直观。
规则9.将类的成员私有化
【规则】
面向对象编程的一个原则是隐藏内部的数据,有时候我们为了方便直接将数据申明为public,应避免这种做法,虽然一时间节约了不少编码时间,但有时也会代码极大的不便。
麻烦吗?【带来的优势】
代码封装性好
有利于调试
规则10.类中的申明顺序
【规则】
类的中函数和成员的申明分为三块,分别顺序是
public
protected
private【规则】
如果没有该块可以直接忽略在,在每个块中的函数和成员的申明中,成员函数在成员变量的前面
每块中其他声明顺序如下:
typedef和enums
常量
构造函数
析构函数
成员函数,含静态成员函数
数据成员,含静态数据成员【带来的优势】
代码封装性好
有利于调试
规则11.编写短小的函数
【规则】
如果没有特殊的需求,函数的长度控制在40行左右,如果过长不影响程序的运行的情况将长函数进行分割。【带来的优势】
提取重复的代码
便于他人阅读和修改
便于发现和定位bug
规则12.输入的引用参数需要添加上const
【规则】
如果传入用引用型参数请务必添加上const【带来的优势】
约束的调用行为
自解释了参数的作用
使得传入的参数不在函数内部被修改
规则13.自增自减操作
【规则】
前置自增和自减的效率要好于后置,特别对于迭代器来说【带来的优势】
提高执行效率
规则14.尽量使用const
- 【规则】
尽量的使用const定义参数类型 - 【使用的条件】
如果函数不会修改传入的引用后指针类型的参数,返回的参数应该为 const;
不修改数据的函数都指定为const
如果成员变量在构造后不会改变,申明为const - 【带来的优势】
约束变量的操作行为 - 【注意点】
类作为函数的参数,尽量使用引用或者指针避免拷贝与赋值构造
规则15. 0、NULL与初始化
- 【规则】
整数用0
实数用0.0
指针用NULL
字符串用“\0” - 【带来的优势】
通过初始化的值就可以判断变量的类型
规则16. Sizeof的使用
【规则】
尽可能的用sizeof(varname)而不是sizeof(type)【带来的优势】
防止变量类型在运行时被改变了
规则17.命名变量
- 【规则】
不要定义名称无法自解释
错误的拼写或者拼写不完整
类名称全部以大写开头
结构体,枚举全部大写开头
变量命名一律小写开头
类成员变量以m_开头
常量使用小写k开头
函数名称以大写开头,单词之前首字母大写
类的存取函数,取函数以Get开头,设置函数以Set开头
枚举类型中的值全部大写表示
全局变量,所有的全局变量使用g_开头
宏名称全部大写,单词之间通过下划线进行分割