const常量与define宏定义的区别

(1) 编译器处理方式不同
  define宏是在预处理阶段展开。
  const常量是编译运行阶段使用。
(2) 类型和安全检查不同
  define宏没有类型,不做任何类型检查,仅仅是展开。
  const常量有具体的类型,在编译阶段会执行类型检查。
3) 存储方式不同
  define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存。
  const常量会在内存中分配(可以是堆中也可以是栈中)。
const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量,存放在静态区),而#define定义的宏常量在内存中有若干个拷贝。

用宏来取代常数,好处是:
1)让代码更简洁明了
当然,这有赖于你为宏取一个适当的名字。一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。
2)方便代码维护
就如前面说的3.14159。哪天你发现这个∏值精度不够,想改为3.1415926,那么你只修改一处宏,而不是修改代码中的所有宏。
原来的宏:
#define PAI 3.14159
修改后的宏:
#define PAI 3.1415926
对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。完成预处理后,所有原来的“PAI”都成了立即数3.1415926。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。这容易带来一些问题,所以C++使用另一更稳妥的方法来代替宏的这一功能。

常量定义的格式为:
const 数据类型 常量名 = 常量值;
相比变量定义的格式,常量定义必须以 const 开始,另外,常量必须在定义的同时,完成赋值。
const float PAI = 3.1415926;
const 的作用就是指明这个量(PAI)是常量,而非变量。
常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变PAI的值,比如:
const float PAI = 3.14159;
double zc = 2 * PAI * R;
PAI = 3.1415926;        //错误!,PAI不能再修改。
double mj = PAI * R * R; 
如果一个常量是整型,可以省略指出数据类型,如:
const k = 100;
相当于
const int k = 100;
反过来说,如果不指定数据类型,则编译器将它当成整型。比如:
const k = 1.234;
虽然你想让k等于一个实型数,然而,最终k的值其实是1。因为编译器把它当成整型常量。
我们建议在定义变量时,明确指出类型,不管它是整型或其它类型。
const int i = 100;
const double di = 100.0;

你可能感兴趣的:(Const)