一、#define
含义
define是宏定义,编译器不对其进行错误检查,在预编译阶段处理,没有作用域限制属于全局常量,在程序中编译器会对定义的常量名以数值进行替换,且每次替换都分配内存,此方法对于大量常量的情况下会占用较多内存从而导致程序效率。
用法
一般用于全局型常量的定义,通常较少使用,在具有较少全局型常量(程序各处都可能用到该常量)时使用。
二、enum
含义
enum是枚举常量定义,在编译阶段处理,有作用域限制。枚举类型中可以定义多个常量(往往是同一归属的常量,比如定义星期可以有7种,enum weekday{one=1,two=2,three=3};(weekday是定义的枚举类型名)),需注意的是在C++中enum枚举类型中只能赋值int型值(即使可以赋值字符,但输出仍是整型)。
用法
一般用于某种类型具有多个常量的时候定义,比如某种功能实现有三种方法,可定义enum method{method0=0,method1=1,method2=2}来选择使用哪种方法实现其功能
三、const
含义
const是常量定义,在编译阶段处理,作用域限制,定义常量分配内存后后续再使用常量情况下不会再为其分配内存,只分配一份内存地址,故常用于此方法定义常量。
用法
一般用于类常量,常配合static来使用,定义类中静态常量,类的任何对象都能够共享此常量static const常量在定义时初始化。程序中往往多使用const来替代define。
四、TiPs
- define 宏定义常量,在开始预处理时就要被替换,所以定义的记号名不会进入记号表,当编译调试时,因为到时直接是一个数值,可能让人产生迷惑。 可以用const 和 enum 来代替宏。常量肯定会进入记号表,可以更容易跟踪,使用常量可能比使用#define导致较小量的码,因为编译器会盲目的将宏定义进行替换,而常量一般在内存中只有一份实体
- 我们无法利用#define创建一个class专属常量,因为#define并不重视作用域。
- 取一个const地址是合法的,但取一个enum的地址是不合法的,取一个#define的地址也不合法