C++学习4:宏定义#define与常量const

来源:互联网 发布:php 视频断点续传 编辑:程序博客网 时间:2024/06/08 14:14

今天在看C++ Primer Plus时,看到其中说到常量定义时,使用const要优于#define,解释的有些模糊,从网上找到了资料来详细的学习一下。

这位大神总结的很好,一起膜拜学习。
http://blog.csdn.net/love_gaohz/article/details/7567856

1. const

用于定义常量数据类型,通过const定义的变量不能被修改。
对于普通数据类型,有两种写法,效果相同:

const int A = 1int const A = 1

对于指针类型,需要注意,存在三种形式,最后一种效果不同:

const int *p = #; //*p不能被修改,p能被修改,即指向的内存空间内容不能被修改,指针的指向可以修改int const *p = #; //*p不能被修改,p能被修改,同第一种int *const p = #; //*p能被修改,p不能被修改,即指针的指向不能被修改,指向的内存空间内存可以被修改。

2. #define

宏定义,用于替换表示。
最常见的就是定义常量:

#define N 1000

和const int N = 1000,效果相同。因此这一点与const存在交集,需要对比的也就是这一点。
还可以定义函数:

#define max(x,y) (x)>(y)?(x):(y);

另外一个重要用途是条件编译:

#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; //再进行宏替换,又一次分配内存!  
0 0
原创粉丝点击