1 定义常量的4种方法
1.1 宏定义
#define <宏名,别名> <替换文本,真正的名称>
例如: #define MAX 65535
注:宏一般用于定义值的别名,在预处理阶段,会将别名替换为真正的名称(文本层面的替换)
所以宏常量没有范围的说法,但是替换到具体的使用场景时,需要考虑数值范围
宏定义的目的:
- 增加文本的可读性,把用到的常量定义成有意义的名字;
- 无需函数调用,运行效率高;
- 对于一些简单的操作,无需调用函数,虽然编程是强调模块化,但是函数调用时,需要保护现场和恢复现场。这些都需要耗时。对于复杂的操作来讲,这些耗时可以不计,但是对于简单的操作,则效率低下。利用宏来代替简单的操作,则可以提高程序的运行效率。
- 可维护行好; 对于常用的常量或者简单操作,修改时只需修改宏定义,不需要逐条修改。
预处理阶段主要任务
①头文件包含;②条件编译;③宏定义展开
1.2 const
const int max = 20;
- const常量有数据类型,宏常量没有数据类型
- 编译器可以对const进行类型安全检查,而宏常量只能进行字符替换
- 集成化调试工具可以对const常量进行调试,但是不能对宏常量进行调试
-
#define 定义的常量是全局的。如果类中要定义常量,应该使用const修饰数据成员
-
但是要注意在编译时被全部求值数据成员只在某个对象的生存期内是常量,而对于整个类而言是可变的
-
类可以创建多个对象,不同对象的const值可不同;所以不能在类声明中初始化const数据成员,const数据成员初始化只能在类构造函数的初始化表中进行
-
1.3 enum
注: C++ 中一种派生数据类型,它是由用户定义的若干枚举常量的集合
enum 枚举名 {枚举元素1,枚举元素2,……};
- 在编译时被全部求值
- enum 常量隐含数据类型是整数,其最大值有限,且不能表示浮点类型
- 枚举常量不会占用对象的存储空间
1.4 constexpr
注:编译过程就能得到计算结果的表达式
const和constexpr区别
- 对于修饰对象来说,const未区分出编译期常量和运行期常量,constexpr限定在了编译期常量
- 在constexpr声明中如果定义了一个指针,限定符constexpr仅对指针有效,与指针所指的对象无关。