A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天在看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; //再进行宏替换,又一次分配内存!  

5 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
棒棒哒
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马