常量的本质及其用法

来源:互联网 发布:蜘蛛软件 爬虫软件 编辑:程序博客网 时间:2024/05/22 03:41

常用的常量可以分为:字面常量、符号常量、契约性常量、布尔常量和枚举常量等。

字面常量:应该是程序中使用最多的常量,例如直接出现的各种进制的数字、字符或字符串等。即是基本数据类型的字面常量;字面常量只能引用,不能修改,所以语言实现一般把它保存在程序的符号表里面而不是一般的数据区中。符号表是“只读”的,是一种访问保护机制,但不是只读存储器(ROM)。

符号常量:存在两种符号常量,一种用#define定义的宏常量,另一种用const定义的常量。由于#define是预编译伪指令,它定义的宏常量在进入编译阶段前就已经被替换为所代表的字面常量了,因此宏常量本质上是字面常量。在C语言中,const定义的常量本质上是值不能修改的变量,因此会给它分配存储空间(外连接的);但在C++中,const定义的常量要具体情况具体对待:对于基本数据类型的常量,编译器会把它放在符号表中而不分配存储空间,而ADT/UDT的const对象则需要分配存储空间(大对象),还有一些情况也需要分配存储空间,例如强制声明为extern的符号常量或取符号常量的地址操作,都将强迫编译器为这些常量分配存储空间。

怎样取一个const符号常量的地址:对于基本数据类型的const常量,编译器会重新再内存中创建它的一个拷贝,你通过其地址访问到的就是这个拷贝而非原始的符号常量;而对于构造类型的const常量,实际上它是编译时不允许修改的变量,因此如果你能绕过编译器的静态类型安全检查机制,就可以在运行时修改其内存单元。示例如下:


契约性常量:契约性const对象的定义并未使用const关键字,但被看做是一个const对象,如下所示:


枚举常量:C++/C的构造类型enum实际上常用来定义一些相关常量的集合。标准C++/C规定枚举常量的值是可以扩展的,并非受限于一般的整型数的范围。

如下示例:


布尔常量:略。


建议:尽量使用含义直观的符号常量来表示哪些将在程序中多次出现的数字或字符串。


规则:1)在C++需要对外公开的常量放在头文件中,不需要对外公开的常量放在定义文件的头部。为便于管理,可以把不同模块的常量几种存放在一个公用的头文件中;2)如果某一常量与其他常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值。如下: const float RADIUS = 100; const float DIAMETER = RADIUS *2;


注意:不能在类声明中初始化非静态const数据成员,因为在类的对象被创建之前,编译器无法知道SIZE的值是多少。非静态const数据成员的初始化只能在类的构造函数的初始化列表中进行:




怎样建立整个类中都恒定的常量????,可以使用枚举常量和static const来实现:

class A

{

  ...

 enum

 {

SIZE1 = 100, //枚举常量

SIZE2 = 200

 }

 int array1[SIZE1];

 int array1[SIZE2];

};