【前言】

  相信大家看别人代码的时候都遇到过,有人用#define定义,也有人用const定义。

  那么两者的区别到底是什么呢?哪个更好用呢?

  网上查了又查,下面总结一下。

【总结】

  • 编译器处理方式不同

    #define宏是在预处理阶段展开

    const常量是编译运行阶段使用

  • 类型和安全检查不同

    #define宏没有类型,不做任何类型检查,仅仅是展开

    const常量有具体的类型,在编译阶段会执行类型检查

  • 存储方式不同

    #define宏仅仅是展开,有多少地方使用,就展开多少次,不会分配内存

    const常量会在内存中分配(可以是堆中也可以是栈中)

  • const 可以节省空间,避免不必要的内存分配。 例如:

      #define PI 3.14159 //常量宏  
      const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......  
      double i=Pi; //此时为Pi分配内存,以后不再分配!  
      double I=PI; //编译期间进行宏替换,分配内存  
      double j=Pi; //没有内存分配  
      double J=PI; //再进行宏替换,又一次分配内存!  
      const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份   拷贝,而 #define定义的常量在内存中有若干个拷贝。

  • const提高了效率

    编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,提高了效率

  • const较#define的优点

    • const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误(边际效应)
    • 有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试
  • 在C++中程序只使用const常量而不使用宏常量,即const常量完全取代宏常量
  • 如果某一常量与其它常量密切相关,应在定义中包含这种关系,而不应给出一些孤立的值
 //例如
const float RADIUS = ;
const float DIAMETER = RADIUS * ;
  • 不能再类声明中初始化const数据成员
 class A{
const int SIZE = ; //错误 企图在类声明中初始化const数据成员
int array[SIZE]; //错误 未知的SIZE
}
  • const数据成员的初始化只能在类构造函数的初始化表中进行
 class A{
A(int size); //构造函数
const int SIZE;
}
A::A(int size) : SIZE(size){ // 构造函数的初始化表

}
A a(); // 对象 a 的SIZE值为100
A b(); // 对象 b 的SIZE值为200
  • 用枚举常量来实现在整个类中恒定的常量
 class A{

enum { SIZE1 = , SIZE2 = }; // 枚举常量
int array1[SIZE1];
int array2[SIZE2];
};
//枚举常量不会占用对象的存储空间,它们在编译时被全部求值。
//枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。

就这么多吧,不深究了

【编程基础】const与#define的区别的更多相关文章

  1. C++编程中const和#define的区别

    (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用.(2) 类型和安全检查不同 define宏没有类型,不做任何类型检查,仅仅是展开. const常量有具 ...

  2. 在php中定义常量时,const与define的区别?

    问]在php中定义常量时,const与define的区别?  [答]使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很 ...

  3. C++ 中 const和define的区别

    来源网址:http://wujiangping.blog.163.com/blog/static/195182011201255115125205/ 请区别用#define命令定义的符号常量和用con ...

  4. const与#define的区别、优点

    const与#define的区别 编译器处理方式不同 define宏是在预处理阶段展开. 补充:预处理器根据以#开头的命令,修改原始的程序.比如我们常见的#include <stdio.h> ...

  5. const和#define的区别

    在刷题的时候经常遇到定义全局常量我一般都是用#define(可能是因为很少接触const的原因) 在昨天做到51nod1082时照常暴力用#define定义最大.可是提交超时..... 后来看他人写的 ...

  6. php 中const和 define的区别

    在php中定义常量时,可用到const与define这两种方法,那他们到底有什么区别呢? 1.const用于类成员变量的定义,一经定义,不可修改.define不可用于类成员变量的定义,可用于全局常量. ...

  7. 详解php常量const与define的区别和实例

    所谓常量是一个简单的标识符.在脚本执行期间该值不能改变.常量默认大小写敏感.通常常量标识符总是大写的.常量只能包含标量数据(boolean.integer.float和string).可以定义reso ...

  8. php中const和define的区别

    define部分:宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段.(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议.)宏的语法为:#define 宏名称 宏值作为一种建议和一种广大 ...

  9. const与define的区别

    const与#define最大的差别,Const在堆栈分配了空间,而#define只是把具体数值 直接传递到目标变量罢了.或者说,const的常量是一个Run-Time的概念,他在程 序中确确实实的存 ...

随机推荐

  1. 项目中libevent几个问题

    几个问题: .libevent到底用的是select还是iocp,然后是如何突破64限制的 typedef struct fd_set { u_int fd_count; /* how many ar ...

  2. 并行编译加快 VS C++ 项目的编译速度

    最近编译的项目都比较大,话说自己的电脑配置还行,但编译所花的时间还是很长,遇到需要重新编译整个项目的时候真的有回宿舍睡一觉的冲动.昨天一不小心被我发现了一款软件Xoreax IncrediBuild ...

  3. 微信变声器(WeChat Voice)会是营销新利器吗

    微信变声器(WeChat Voice)2.0 Android版开始内测了,时间从2015年5月20日 - 2015年6月20日,使用微信变声器改变你的声音,并分享给好友! 无论你是想装可爱还是恶搞,微 ...

  4. uuid-不好之处

    数据库中直接存储UUID的坏处: 完全‘随机’的字符串,例如由MD5().SHA1().UUID()产生的.它们产生的每一个新值都会被任意地保存在很大的空间范围内, 这会减慢INSERT及一些SELE ...

  5. DC-DC升压(BOOST)电路原理

    BOOST升压电路中:      电感的作用:是将电能和磁场能相互转换的能量转换器件,当MOS开关管闭合后,电感将电能转换为磁场能储存起来,当MOS断开后电感将储存的磁场能转换为电场能,且这个能量在和 ...

  6. JsRender系列demo(6)-无名

    <!DOCTYPE html> <html> <head> <script src="http://code.jquery.com/jquery.j ...

  7. SNAT

    http://blog.chinaunix.net/uid-2628744-id-2454879.html

  8. lintcode 中等题:N Queens N皇后问题

    题目: N皇后问题 n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击.<不同行,不同列,不同对角线> 给定一个整数n,返回所有不同的n皇后问题的解决方案. 每个解决方案 ...

  9. [wikioi]线段树练习 2

    http://codevs.cn/problem/1081/ #include <vector> #include <iostream> #include <string ...

  10. QT5删除隐藏目录+隐藏文件(使用Process::start函数调用系统命令,且等待到结束)

    1.功能需求 删除一个目录(包括目录本身),同时删除该目录中所有文件及目录(含隐藏的) 2.遇到的问题 qt5中已经有了递归删除目录的函数--->bool QDir::removeRecursi ...