
今天在看C++ Primer Plus时,看到其中说到常量定义时,使用const要优于#define,解释的有些模糊,从网上找到了资料来详细的学习一下。
这位大神总结的很好,一起膜拜学习。
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; //再进行宏替换,又一次分配内存!
推荐了解热门学科
传智播客是一家致力于培养高素质软件开发人才的科技公司,“黑马程序员”是传智播客旗下高端IT教育品牌。自“黑马程序员”成立以来,教学研发团队一直致力于打造精品课程资源,不断在产、学、研3个层面创新自己的执教理念与教学方针,并集中“黑马程序员”的优势力量,针对性地出版了计算机系列教材50多册,制作教学视频数+套,发表各类技术文章数百篇。
传智播客从未停止思考
传智播客副总裁毕向东在2019IT培训行业变革大会提到,“传智播客意识到企业的用人需求已经从初级程序员升级到中高级程序员,具备多领域、多行业项目经验的人才成为企业用人的首选。”
中级程序员和初级程序员的差别在哪里?
项目经验。毕向东表示,“中级程序员和初级程序员最大的差别在于中级程序员比初级程序员多了三四年的工作经验,从而多出了更多的项目经验。“为此,传智播客研究院引进曾在知名IT企业如阿里、IBM就职的高级技术专家,集中研发面向中高级程序员的课程,用以满足企业用人需求,尽快补全IT行业所需的人才缺口。
何为中高级程序员课程?
传智播客进行了定义。中高级程序员课程,是在当前主流的初级程序员课程的基础上,增加多领域多行业的含金量项目,从技术的广度和深度上进行拓展。“我们希望用5年的时间,打造上百个高含金量的项目,覆盖主流的32个行业。”传智播客课程研发总监于洋表示。
黑马程序员热门视频教程