#include <iostream>
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是模板元编程的一项基本技术,大量的代码在使用它。