常量:(不可以定义结构型常量)
常量包括字面常量,符号常量,契约型常量,枚举常量这几种类型。
const int a=3; 这里的 a 就是符号常量,3 就是字面常量。
一、字面常量(也叫直接常量)包括:整形常量,字符型常量,字符串常量。注意:不存在数组常量,结构体常量等结构型的字面常量。但是存在结构型的符号常量
二、符号常量:(可以定义结构型常量)
用#define和const定义的常量!
这两种常量之间的区别:
1、#define定义的常量,除了字符串字面常量外都不占内存,所以无法取常量的地址,仅仅是宏替换而已
eg:
#define NAME “pang dong”
本质是字符串字面常量,会占用“静态存储区”
#define MAX 256
本质是整形的字面常量,不会分配内存
2、const定义的常量要分情况考虑:
你可以去一个const符号常量的地址:
对于基本数据类型的const常量,编译器会重新在内存中创建一个他的一个拷贝,(真正的基本数据类型的const常量会被编译器放到符号表中而不分配内存空间)你通过其地址访问到的就是这个拷贝而不是原始的符号常量;
而对于构造类型的const常量,实际上他是编译时不允许修改的常量,是占内存空间的,因此如果你能绕过编译器的静态类型安全检查机制,就可以在运行时修改其内存单元。从理论上讲,只要握有一个对象(针对C++中的结构类型常量)的指针,你就可以设法绕过编译器修改它的内存。
详见《林锐-第三版》P86
**********使用符号常量的好处:
如果不使用符号常量,而是直接在程序中填写数字或字符串,将会有哪些麻烦呢?
(1)程序的可读性(可理解性)变差。程序员自己会忘记那些数字或字符串是什么意
思,用户则更加不知它们从何处来、表示什么。
(2)在程序的很多地方输入同样的数字或字符串,难保不发生书写错误。
(3)如果要修改数字或字符串,则会在很多地方改动,既麻烦又容易出错。
*************const与#define的比较:
C++语言可以用const来定义常量,也可以用#define来定义常量。但是前者比后
者有更多的优点:
(1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安
全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会
产生意料不到的错误(边际效应)。
(2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调
试。
【规则】在C++程序中只使用const常量而不使用宏常量,即const常量完
全取代宏常量。
浙公网安备 33010602011771号