zoukankan      html  css  js  c++  java
  • const和define的区别

    C++中不但可以用define定义常量还可以用const定义常量,它们的区别如下:

    1、编译器处理方式不同
      define宏是在预处理阶段展开。
      const常量是运行阶段使用。
    2、类型和安全检查不同
      define宏没有类型,不做任何类型检查,仅仅是展开。
      const常量有具体的类型,在编译阶段会执行类型检查。
    3、存储方式不同
      define宏不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大。
        const常量会分配内存(可以是堆中也可以是栈中),在程序运行过程中内存中只有一个拷贝
    4、在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
    宏替换只作替换,不做计算,不做表达式求解。
    5、有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。
    6、define宏不可以用指针变量去指向的,const常量可以用指针去指向该常量的地址的。
    7、用define可以定义一些简单的函数,const是不可以定义函数的。
    8、宏定义的作用范围仅限于当前文件。
    默认状态下,const对象只在文件内有效,当多个文件中出现了同名的const变量时,等同于在不同文件中分别定义了独立的变量。
    如果想在多个文件之间共享const对象,必须在变量定义之前添加extern关键字(在声明和定义时都要加)。
    9、有时希望某些常量只在类中有效。由于#define定义的宏常量是全局的,不能达到目的,于是想当然地觉得应该用const修饰数据成员来实现。const数据成员的确是存在的,但其含义却不是所期望的。const数据成员只在某个对象生存期内是常量,而对于整个类却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。

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

  • 相关阅读:
    array_map()与array_shift()搭配使用 PK array_column()函数
    Educational Codeforces Round 8 D. Magic Numbers
    hdu 1171 Big Event in HDU
    hdu 2844 poj 1742 Coins
    hdu 3591 The trouble of Xiaoqian
    hdu 2079 选课时间
    hdu 2191 珍惜现在,感恩生活 多重背包入门题
    hdu 5429 Geometric Progression 高精度浮点数(java版本)
    【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
    hdu::1002 A + B Problem II
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8608243.html
Copyright © 2011-2022 走看看