【前言】

  相信大家看别人代码的时候都遇到过,有人用#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. [设计模式] 8 组合模式 Composite

    DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一 ...

  2. css ul li 制作导航条

    <html> <head> <style> .test ul{list-style:none;} .test li{float:left; width:100px; ...

  3. 数据库批量插入数据的shell脚本

    测试用,先来一个简单的,这个是国产神通数据库的,用isql命令: !/bin/bash == "-h" ] then echo "USAGE: $0 table_name ...

  4. MSVC CRT运行库启动代码分析

    原文链接:http://www.programlife.net/msvc-crt-startup.html 在程序进入main/WinMain函数之前,需要先进行C运行库的初始化操作,通过在Visua ...

  5. grunt安装失败处理

    1.官网 Grunt官网 http://gruntjs.com 2.前言 前段时间一不小心升级了win10(万恶的360),各种不适应各种问题各种软件bug,最终决定回退到win7,然后悲催的发现系统 ...

  6. ubuntu12.10+NDK r9 编译 ffmpeg 的一些参考资料Perhaps you should add the directory containing `libssl.pc'

    首先入门级的 编译宝典: https://trac.ffmpeg.org/wiki/CompilationGuide/Android http://www.roman10.net/how-to-bui ...

  7. VisualSvn+TortoiseSVN的安装说明

    一.VisualSvn安装及简单使用 下载VisualSvn:VisualSVN-Server-2.5.5.msi 系统:Win7系统 安装步骤: 1.下载VisualSVN-Server-2.5.5 ...

  8. mysql的学习记录

    1 MySQL -h localhost -u UserName -p Password-h不写,默认为localhost注意:最好先MySQL -h localhost -u UserName -p ...

  9. 用 EasyBCD 在 Win7/8 中硬盘安装 Ubuntu

    写在前面: 1. 我装的是ubuntu 13.10 64位,不一样的地方是,从casper文件夹复制出来的文件不是vmlinuz,而是vmlinuz.efi,相应的,menu.lst里也要将vmlin ...

  10. *[hackerrank]ACM ICPC Team

    https://www.hackerrank.com/contests/w6/challenges/acm-icpc-team 这道题在contest的时候数据量改小过,原来的数据量需要进行优化才能过 ...