【前言】

  相信大家看别人代码的时候都遇到过,有人用#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. windows 64位整数

    #include <iostream> #include <ctime> using namespace std; int main() { cout << cou ...

  2. 让32位Eclipse和64位Eclipse同时在64的Windows7上运行

    转自让32位Eclipse和64位Eclipse同时在64的Windows7上运行 参考这篇文章:http://wenku.baidu.com/view/57994c270066f5335a81214 ...

  3. tomcat 解析(一)-文件解析

    做web项目,最常用的服务器就是Apache的tomcat.虽然一直在用tomcat,但都是仅限在使用的阶段,一直没有深入学习过.想深入学习tomcat,首推的肯定是官网:http://tomcat. ...

  4. Choosing Columns and Expressions to Index

    A key is a column or expression on which you can build an index. Follow these guidelines for choosin ...

  5. [转载]Spring Java Based Configuration

    @Configuration & @Bean Annotations Annotating a class with the @Configuration indicates that the ...

  6. poj 2387 Til the Cows Come Home (最短路,dijkstra模版题)

    题目 #define _CRT_SECURE_NO_WARNINGS #include<string.h> #include<stdio.h> #include<math ...

  7. D&F学数据结构系列——二叉堆

    二叉堆(binary heap) 二叉堆数据结构是一种数组对象,它可以被视为一棵完全二叉树.同二叉查找树一样,堆也有两个性质,即结构性和堆序性.对于数组中任意位置i上的元素,其左儿子在位置2i上,右儿 ...

  8. C# 面向对象之概念理解

    什么是对象? <韦氏大词典>中对对象定义: (1)某种可为人所感知的物质. (2)思维.感受或动作所作用的物质或精神体. ----说白了万物皆对象 熟悉的对象描述: 对象就是客观世界中的物 ...

  9. 分享一个安装PE到硬盘的软件

    Ton8pe_v5.0下载地址:http://pan.baidu.com/share/link?shareid=424350&uk=4180312589 电脑是XP,有光驱,但是没win8.1 ...

  10. lintcode:previous permutation上一个排列

    题目 上一个排列 给定一个整数数组来表示排列,找出其上一个排列. 样例 给出排列[1,3,2,3],其上一个排列是[1,2,3,3] 给出排列[1,2,3,4],其上一个排列是[4,3,2,1] 注意 ...