《C++编程规范:101条规则、准则与最佳实践》阅读、总结:
长语句,要用续行符;低优先级操作符处划分新行,适当缩进;
头文件最后一行为空行,以消除编译警告。
switch 语句必须有default分支。
尽量用乘法代替除法,特别是浮点运算;(浮点除法占用较多的CPU);
unsigned char size = 0;//相当于uint_8
size-1 不会小于0,而是0xff;
严禁使用未经初始化的变量作为右值,特别是引用未经赋值的指针,经常会引起程序崩溃,如:段错误,核心已转储。
struct元素个数应适中,可适当划分成子结构体,以增加可理解、可操作、可维护性。
一个函数仅完成一个功能,不要设计多用途、面面俱到到函数,多功能集于一身,使理解、测试、维护变得困难。
使用宏定义表达式时,要使用完备的括号:
#define AREA(a,b) ((a)*(b)) //因为a和b可能是表达式;宏替换后a*b的两侧也可能有其它运算符。因此,需要全部加括号。
判断指针是否为空,建议直接与NULL比较,而不是使用“!”
路径使用斜线/,而不是反斜线\, /能被不同平台识别。
# STL的使用
用vector和string代替数组,更安全、方便。
# 关于类
- 小类代替巨类;易于编写、测试、使用。
- 以同样的顺序定义和初始化成员变量:
成员变量初始化的顺序要与类定义中声明顺序保持一致,不用考虑构造函数初始化列表中编写的顺序。
很难发现。
eg:
class Test
{
public:
Test(int a, int b): m_a(a), m_b(b), m_fun_ab(m_a + m_b + 1)
private:
int m_fun_ab; //在m_a和m_b之前声明,将最先被初始化。
int m_a;
int m_b;
};
应改为:
class Test
{
public:
Test(int a, int b): m_a(a), m_b(b), m_fun_ab(m_a + m_b + 1)
private:
int m_a;
int m_b;
int m_fun_ab;
};
- 显示禁止复制和赋值
class T
{
private://使T不能复制
T(const T&);//未实现
T& operator= (const T&);//未实现
};
1)注释要有文件头,函数头,变量命名注释等;
2)函数命名,以及变量命名,必须要满足自释义(命名可以进行自我解释),并且保持团队的风格统一;
3)所有的成员变量数据必须私有;
4)结构体要注意对齐申请问题;
5)构造函数内不要申请资源(内存,线程),申请内核对象等,避免申请失败又不能通过返回值告知;
6)嵌套不应超过3层(if,for,while等等);
7)可以复用的代码应设计函数或定义宏;
8)函数返回值的设计要注意,简单赋值和释放资源的函数(函数逻辑无分支)返回值可以用void,IsValidFunc这一类命名的函数(函数逻辑两条分支)可以用BOOL,其它的函数(函数逻辑分支大于2)都必须用int或uint等类型作为返回值,并设计足够充分的状态码(错误码)作为函数返回值的统一管理;
9)在函数内部,调用其它函数时,必须判断该函数的返回值,并做相应处理;
10)函数的参数个数,应尽量少,一般不超过3个,并且单个参数的数据量应控制在最少,比如结构体不应作为参数,而应使用结构体指针;
11)函数执行时,应首先对函数的传入参数进行有效性判断;
12)代码内部避免出现MAGIC NUMBER(0和1之外的数字),应使用宏定义,或者静态量;
13)一个代码工程内部会普遍复用的参数(比如圆周率),函数(基本算子),可以设计为通用库,供合作开发复用;甚至可以在多个代码工程内复用;
14)应使用内存池,线程池等技术,高效稳定使用资源,内存只在初始化的时候申请一次,程序退出时释放一次,绝对避免出现频繁的内存(线程)申请释放等工作;
15)少量的数据空间使用可以用栈内存,避免使用堆内存。
16)基本上不允许出现全局变量;
17)满足编程目的的情况下,尽可能使用简单的做法,避免炫技(比如指针的指针,指针的引用这类要花时间理解的做法)
18)一个函数代码行数一般控制在100行以下,最多不要超过200行;