#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;
}
運行結(jié)果:
sizeof(Class A) = 1
sizeof(Class B) = 4
說明枚舉類型本身不會占用內(nèi)存空間,而枚舉的對象會占用內(nèi)存空間
define 定義的常量,在預編譯的時候做了替換,而enum定義的常量,并不是在預編譯的時候進行替換,只是在編譯的時候,根據(jù)標識去常量區(qū)獲取對應的值。
//對于支持類內(nèi)初始化的C++編譯器,這段代碼可以編譯通過。
class Game {
private:
static const int GameTurn = 10;
int scores[GameTurn];
};
//較老編譯器可能不支持類內(nèi)初始化,這樣靜態(tài)常量,須在類外初始化
class Game {
private:
static const int GameTurn;
int scores[GameTurn];
};
const int Game::GameTurn = 10;
//如果沒有int scores[GameTurn],
//這段代碼就可以在不支持類內(nèi)初始化的編譯器通過
//但int scores[GameTurn];用到GameTurn,而GameTurn的值不能確定。所以會報如下錯誤
enum_hack.cpp:5: error: array bound is not an integer constant
此時,我們?nèi)圆幌胗糜簿幋a數(shù)字指定數(shù)組大小,可以使用:enum hack
使用enum hack的技巧,其思想就是把GameTurn定義為一個枚舉常量
class Game {
private:
enum {GameTurn = 10};
int scores[GameTurn];
};
enum hack的行為更像#define而不是const,如果你不希望別人得到你的常量成員的指針或引用,你可以用enum hack替代之。
為什么不直接用#define呢?
首先,因為#define是字符串替換,所以不利于程序調(diào)試。
其次,#define的可視范圍難以控制,比如你怎么讓#define定義的常量只在一個類內(nèi)可見呢?除非你用丑陋的#undef。
使用enum hack不會導致 “不必要的內(nèi)存分配”。
enum hack是模板元編程的一項基本技術(shù),大量的代碼在使用它。