简介
1. 易忽略的常量:函数地址(函数名)、静态数组的名字、字符串常量的地址。
2. 常量分类:字面常量、符号常量、契约性常量、布尔常量、枚举常量。
常量认知
1. 字面常量
包括:各种进制的数字、字符、字符串。
存储位置:程序的符号表中,非数据区。只能引用不能修改。只允许获取字符串的地址。
1 x=-100.25f; 2 char c='a'; 3 const char *pchar = "abcd"; 4 int *pInt = NULL;
2. 符号常量
包括:#define 定义的宏常量、const定义的常量。
#define //const常量存储方式 1. #define 定义的宏常量在进入编译阶段之前就已经被替换为字面常量,宏常量的本质就是字面常量。 |
const //const常量存储方式 1. C中,const常量为值不能修改的变量,分配存储空间。 2. C++中,基本数据类型的const常量放置在符号表中, ADT数据类型、强制extern的const常量分配存储空间。 //有用的实践 3. 取const常量的地址: 基本数据类型const常量:编译器在内存中创建一个拷贝,实际访问的是拷贝地址,非原始地址,无法通过指针修改基本类型const常量。 构造数据类型const常量:可以通过获取常量指针,绕过编译器修改const常量。 结论:只要得到对象的指针(内存地址),就可以越过编译器修改其内容,除非受到操作系统保护。 |
3. 使用符号常量替代字面常量
why:
a.提高程序可读性。
b.方便多处的相同数字或字符串修改。
c.避免多次输入同样的数字或字符串引入错误。
4. 类中的常量
作用:
将常量与类关联在一起,使其只在类中生效。
方式:
a.单个对象中的常量
类中声明的const常量:
//只是对象声明周期内的常量
//不同对象的const常量可不同
1 class A 2 { 3 A(int size) 4 const int SIZE; //常量声明 5 const int size=10 错误的用法 6 }; 7 8 9 A::A(int size):SIZE(size) //利用构造函数初始化列表初始化常量 10 { 11 } 12 13 A a(100); //SIZE==100 14 A b(200); //SIZE==200
b.整个类内的常量:所有对象共享的常量
enum常量:
enum常量不占据对象的内存空间
1 class A 2 { 3 enum 4 { 5 SIZE1=100; 6 SIZE2=100; 7 }; 8 int array1[SIZE1]; 9 };
static const 常量:
1 class A 2 { 3 static const int SIZE=100;//某些编译器不支持该用法 4 5 int array[SIZE]; 6 };