【前言】

  相信大家看别人代码的时候都遇到过,有人用#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. Win 7怎样拒绝所有可移动存储设备的所有权限

    在Windows 7中,我们可拒绝对任何可移动存储类的权限.下面让我来教大家怎样在组策略中启用“所有可移动存储类:拒绝所有权限”策略,具体操作步骤如下所述: 步骤/方法 在开始搜索框中键入“gpedi ...

  2. crontab 不能执行git命令问题备忘

    这问题够隐蔽,折腾了近两个小时. 命令 git checkout tagname 手工执行都正常 但在crontab运行时发现分支一直切不过去. 后来告诉是crontab默认的 path  设置和系统 ...

  3. DB2 中将date类型的转换成timestamp

    方法1: TIMESTAMP(Char(date)||'00.00.00') SELECT T2.RECORDNO,T2.DANGERTIME,T2.BIZORIGIN,T3.COMMONNAME A ...

  4. c# 组元(Tuple)

    组元是C# 4.0引入的一个新特性,编写的时候需要基于.NET Framework 4.0或者更高版本.组元使用泛型来简化一个类的定义. 先以下面的一段代码为例子: public class Poin ...

  5. PSYoungGen /PSOldGen/PSPermGen区别

    原文地址:http://bbs.csdn.net/topics/210064791 谁能解译一下PSYoungGen /PSOldGen/PSPermGen区别及出现的问题? 看来没有收集到答案,查看 ...

  6. 深入浅出Java并发包—指令重排序

    前面大致提到了JDK中的一些个原子类,也提到原子类是并发的基础,更提到所谓的线程安全,其实这些类或者并发包中的这么一些类,都是为了保证系统在运行时是线程安全的,那到底怎么样才算是线程安全呢? Java ...

  7. 缓存初解(三)---Spring3.0基于注解的缓存配置+Ehcache和OScache

    本文将构建一个普通工程来说明spring注解缓存的使用方式,关于如何在web应用中使用注解缓存,请参见: Spring基于注解的缓存配置--web应用实例 一.简介 在spring的modules包中 ...

  8. epmap服务

    epmap是 tcp 135和udp135端口135端口的“epmap - DCE endpoint resolution”记录可以通过连接到135端口和做适当的查询列举出来. 135端口大多数情况下 ...

  9. asp.net开源CMS推荐

    随着网络技术的发展,目前国内CMS的开发商越来越多,各自都有其独特的优势,大家在选择的时候觉得眼花缭乱,不知道选择哪个比较好,我个人认为开源的CMS还是适合我们学习及研究使用,下边就几个国内的asp. ...

  10. iosUITextField属性

    @property UITextField *caption; caption = [[UITextField alloc] initWithFrame:CGRectMake(, self.frame ...