★条款:尽量以const, enum, inline替换#define
#define ASP 3.14
//替换为
const double ASP = 3.14
原因:#define是预处理指令,它的宏名称在编译器处理之前已经被移走,当出现错误时,不会提示宏名称(如上面的ASP),而是提示宏所替代的常量3.14,这样我们很难排查到错误。
★条款:确定对象使用前已先被初始化
int a; //未初始化
int b = 0; //对int进行手工初始化
const char* text = "a string"; //对指针进行手工初始化
原因:对象未进行初始化时,可能会是一个随机值。如:上面的int型变量a。
1、内置类型(int、char、string等等)直接手工初始化。
2、类中的成员变量则需要通过构造函数进行初始化。
注意:
1)对象的成员变量是在进入构造函数之前初始化的,构造函数内部是属于对变量进行赋值。
2)成员变量初始化方式:一般通过初值列表对成员变量进行初始化。
class Monte{
public:
Monte(int a, string b, char c):d(a), e(b), f(c){ //构造函数前的初值列表才是属于对成员变量进行初始化操作
d = a; //此处构造函数内部属于对成员变量赋值操作
e = b;
f = c;
}
int d; //这里变量的声明顺序决定其在初值列表中初始化的先后顺序。(对!就是如此)
string = e;
char f;
}
备注:
1)上面代码构造函数前的初值列表对成员变量进行初始化,构造函数只是在对成员变量赋值。
2)成员变量初始化顺序由变量申明的先后顺序决定,而不是初值列表中的顺序。