今天在看C++ Primer Plus时,看到其中说到常量定义时,使用const要优于#define,解释的有些模糊,从网上找到了资料来详细的学习一下。
这位大神总结的很好,一起膜拜学习。
http://blog.csdn.net/love_gaohz/article/details/7567856
1. const
用于定义常量数据类型,通过const定义的变量不能被修改。
对于普通数据类型,有两种写法,效果相同:
const int A = 1;
int const A = 1;
对于指针类型,需要注意,存在三种形式,最后一种效果不同:
const int *p = #; //*p不能被修改,p能被修改,即指向的内存空间内容不能被修改,指针的指向可以修改
int const *p = #; //*p不能被修改,p能被修改,同第一种
int *const p = #; //*p能被修改,p不能被修改,即指针的指向不能被修改,指向的内存空间内存可以被修改。
2. #define
宏定义,用于替换表示。
最常见的就是定义常量:
#define N 1000
1
和const int N = 1000,效果相同。因此这一点与const存在交集,需要对比的也就是这一点。
还可以定义函数:
#define max(x,y) (x)>(y)?(x):(y);
1
另外一个重要用途是条件编译:
#define 宏名 宏体
#ifdef 宏名
程序段1
#else
程序段2
#endif
条件编译可以缩小应用程序的大小,同时可以防止变量重定义和头文件同福包含和编辑。
3. const和#define在定义常量时的区别
1.编译器处理方式不同:
#define在预处理阶段进行处理。
const在编译阶段进行处理。
2.类型不同:
#define没有定义类型,只是简单的字符串替换,不进行任何的检查。
const常量有具体的类型,要进行类型检查。
3.存储方式不同:
#define在预编译中就已经替换了,因此不分配内存,仅仅是展开。#define实际就是给出了立即数,在运行过程中,常量在内存中会有若干个拷贝。
const常量会在内存中分配,可以使堆中也可以是栈中。以后在定义的常量调用时,只是使用对应的内存地址,不再开辟新的空间,在内存中只有一个拷贝,因此const相比#define,可以避免反复分配内存,节省空间。
#define PI 3.14159 //常量宏
const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......
double i=Pi; //此时为Pi分配内存,以后不再分配!
double I=PI; //编译期间进行宏替换,分配内存
double j=Pi; //没有内存分配
double J=PI; //再进行宏替换,又一次分配内存!
|
|