zoukankan      html  css  js  c++  java
  • #define && const

    (1) 编译器处理方式不同

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

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

    (2) 类型和安全检查不同

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

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

    (3) 存储方式不同

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

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

    (4)const可以节省空间,避免不必要的内存分配

    const定义常量从汇编的角度来看,只是给出了对应的内存地址,而不是象#define一样给出的是立即数,所以,const定义的常量在程序运行过程中只有一份拷贝,而 #define定义的常量在内存中有若干个拷贝。 

    例如:  
            #define PI 3.14159 //常量宏  
            const doulbe Pi=3.14159; //此时并未将Pi放入ROM中 ......  
            double i=Pi; //此时为Pi分配内存,以后不再分配!  
            double I=PI; //编译期间进行宏替换,分配内存  
            double j=Pi; //没有内存分配  
            double J=PI; //再进行宏替换,又一次分配内存!  
    (5) 提高了效率。

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

    const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的,因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。

    不能在类声明中初始化const数据成员

    以下用法是错误的,因为类的对象未被创建时,编译器不知道SIZE的值是什么。

    class A
    {
        const int SIZE = 100; // 错误,企图在类声明中初始化const数据成员
        int array[SIZE];       // 错误,未知的SIZE
    };

    const数据成员的初始化只能在类构造函数的初始化表中进行,例如:

        class A
        {…
            A(int size);       // 构造函数
            const int SIZE ;  
        };
        A::A(int size) : SIZE(size) // 构造函数的初始化表
        {
          …
        }
        A  a(100);  // 对象 a 的SIZE值为100
        A  b(200);  // 对象 b 的SIZE值为200

    怎样才能建立在整个类中都恒定的常量呢?(可以用static变量)const数据成员不可以,应该用类中的枚举常量来实现。例如:

        class A
        {…
            enum { SIZE1 = 100, SIZE2 = 200}; // 枚举常量
            int array1[SIZE1];
            int array2[SIZE2];
        };

    枚举常量不会占用对象的存储空间,它们在编译时被全部求值。

    枚举常量的缺点是:它的隐含数据类型是整数,其最大值有限,且不能表示浮点数(如PI=3.14159)。

    sizeof(A) = 1200,其中枚举不占空间。

    enum   EM { SIZE1 = 100, SIZE2 = 200}; // 枚举常量    sizeof(EM) = 4;//因为枚举量是当做整型量来处理的,所以结果全部为4。

  • 相关阅读:
    智算之道复赛
    试题 历届试题 幸运数(模拟)
    使用memcpy函数时要注意拷贝数据的长度
    试题 历届试题 大臣的旅费(求树的直径,两次dfs)
    试题 历届试题 连号区间数(规律)
    试题 历届试题 错误票据(输入处理,桶排序)
    试题 历届试题 剪格子(dfs)
    Rope大法(可持久化平衡树)
    常用数论知识总结(持续更新)
    计蒜客 035 三角形内点的个数(皮克定理)
  • 原文地址:https://www.cnblogs.com/argenbarbie/p/5773881.html
Copyright © 2011-2022 走看看