enum hack

#include 
using namespace std;

class A{
public:
    enum enumHack{a = 5, b = 10};
};

class B {
public:
    enum enumHack { a = 5, b = 10 };
    enumHack eh;
};

int main()
{
    cout << "sizeof(Class A) = " << sizeof(A) << endl;
    cout << "sizeof(Class B) = " << sizeof(B) << endl;

    return 0;
}

运行结果:
sizeof(Class A) = 1
sizeof(Class B) = 4

说明枚举类型本身不会占用内存空间,而枚举的对象会占用内存空间

define 定义的常量,在预编译的时候做了替换,而enum定义的常量,并不是在预编译的时候进行替换,只是在编译的时候,根据标识去常量区获取对应的值。

//对于支持类内初始化的C++编译器,这段代码可以编译通过。
class Game {
private:
    static const int GameTurn = 10;
    int scores[GameTurn];
};

//较老编译器可能不支持类内初始化,这样静态常量,须在类外初始化
class Game {
private:
    static const int GameTurn;
    int scores[GameTurn];
};

const int Game::GameTurn = 10;

//如果没有int scores[GameTurn],
//这段代码就可以在不支持类内初始化的编译器通过
//但int scores[GameTurn];用到GameTurn,而GameTurn的值不能确定。所以会报如下错误
enum_hack.cpp:5: error: array bound is not an integer constant

此时,我们仍不想用硬编码数字指定数组大小,可以使用:enum hack

使用enum hack的技巧,其思想就是把GameTurn定义为一个枚举常量

class Game {
private:
    enum {GameTurn = 10};
    int scores[GameTurn];
};

enum hack的行为更像#define而不是const,如果你不希望别人得到你的常量成员的指针或引用,你可以用enum hack替代之。

为什么不直接用#define呢?
首先,因为#define是字符串替换,所以不利于程序调试。
其次,#define的可视范围难以控制,比如你怎么让#define定义的常量只在一个类内可见呢?除非你用丑陋的#undef。

使用enum hack不会导致 “不必要的内存分配”。

enum hack是模板元编程的一项基本技术,大量的代码在使用它。

你可能感兴趣的:(enum hack)