enum hack

#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ù),大量的代碼在使用它。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容