代码规范小结(二)
前一阵由于修改别人的优质代码而感慨不已,所以想要写一些代码规范的说明,也算是给自己一个提醒。既然如此,就一气呵成,再写一些感觉比较重要的规范。
1. 防止头文件被重复引用,使用#ifndef 工程名_路径_文件名/#define工程名_路径_文件名/#endif结构或者#program once来实现预处理
这里关于#ifdef和#program once的区别做一下简单的解释,#ifdef受C/C++语言标准支持,可以保证同一个文件(或者两个内容完全相同的文件)不被重复包含,缺点就是可能会发生宏名碰撞,由于需要打开头文件后才能判断,所以编译时间肯会长一些。
#program once一般由编译器提供,它是出现在#ifdef之后的,也可以保证同一文件不会被包含两次,它是针对文件的,所以对内容相同的不同文件无法提供这个功能。编译起来也会快一些。
2. 有关类的版式,建议把public的方法写在前面,private的属性写在后面,因为大家可能更关心的是接口的使用,不过这个也看大家的习惯吧
3. If语句不同的类型应该有不同的比较方式
bool类型bool flag:if(flag) if(!flag)
int类型 int num: if(num==0) if(num!=0)
浮点类型float num: if((num>=-EPSINON)&&(num<=EPSINON))
指针类型char *pstr:if(pstr==NULL) if(pstr!=NULL)
我们也可以写成if(NULL==pstr) 这样可以防止作比较时少写一个=号
4. 循环语句的效率提升1,如果可能的话,可以把循环层数多的放在最内层从而减少跨切循环层的次数。
5. 循环语句的效率提升2,如果循环里面有逻辑判断,可以根据情况(循环次数的多少),将判断从循环中提取出来,可以减少逻辑判断的次数。不过可能导致代码不够简洁。
6. C++尽量使用const常量代替#define,常量全部大写
a.const常量有数据类型,编译器可以进行类型安全检查
b.很多调试工具可以对const调试
7. 类中的常量使用enum枚举量来实现(隐含数据类型是整数,不能表示浮点数)
8. 函数的参数要带参数名,这样可以提醒使用的人参数是什么意思
9. 函数里面仅作输入用的指针或者引用参数前应该加const
10. 如果是值传递的话,可以改用const&,这样省去了构造和析构的过程(针对非基本类型)
11. 对于类中的相加运算重载,返回值要使用值传递,因为方法里面的返回值最后会被销毁、
这点需要再进一步分析一下,return返回的东西不可以是指向“栈内存”指针或者引用,因为在方法里面新生成的数据的生命周期都只在{}内,所以返回的指向“栈内存”的指针或者引用会在方法结束时自动销毁。(char p[] = "hello world"; return p;这就是指向栈内存的指针)
下面再举例说一下另一种情况,
比如在方法里面有char *p=”hello”并把return。虽然我们接受到”hello”,但是这个”hello”位于静态存储区域,p指向的就是这块只读的内存块。