一、用const或enum替换#define(单纯常量)
使用#define Con_num 1.55;后,预处理器会将代码中的Con_num替换成1.55。如果这个常量在程序中产生一个编译错误,编译的错误信息可能只提到1.55,而不是Con_num,可能会因为追踪这个而浪费时间。
用const替代:
const double Con_num = 1.55;
使用常量可能比使用#define导致较小量的码。
用enum替代:
枚举类型的基础类型必须为整数型(int、char等),所以只能在需要定义的常量为整型时才能用enum方式替换#define;
#define Con_num 12;可以替换为:enum{Con_num = 12};
二、class专属常量
class专属常量:常量的作用域被限制于class内,常量为class的成员;常量至多只有一份实体,所以常量是一个static成员。#define类似于为全局变量,不能用来定义class专属常量。
(1)使用const:
class A {
public:
static const int Con_num = 12;//常量声明式,而非定义式
};
类中的Con_num是声明式而不是定义式,有些编译器要求定义式,所以要另外提供一个定义式:
const int A::Con_num;
或者在定义式赋值初值:
class A {
public:
static const int Con_num;
};
const int A::Con_num = 12;
(2)使用enum(通过自定义枚举量的值作为一个常量):
class A {
public:
enum { Con_num = 12 }; // 也可以写为enum : int { Con_num = 12 };
};
枚举的基础类型必须是整数型(int、char等),枚举只定义了赋值运算,没有定义算数运算。
三、inline替换#define
当一个宏类似于函数时,可以用template inline替换#define
例:
#define CALL_WITH_MAX(a, b) f((a) > (b) ? (a) : (b))
替换为
template<typename T>
inline Max(const T& a, const T& b){
f(a > b ? a : b);
}