在看effective c++的時候,其中第二條邊指出。盡量使用const ,enum代替define。在寫程式的時候,需要入參為裝置類型,第一反應是枚舉一個裝置類型,并以名字命名。但是有一個問題挺困惑的,類中的枚舉到底是以什麼形式存在的?枚舉變量需不需要配置設定記憶體?
帶着這個問題,咱們來做一個實驗。
- class test
- {
- public:
- enum type{One,Two, Three};
- private:
-
- };
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- cout << sizeof(test)<<endl;
- return 0;
- }
輸出:
想想其實也很容易明白,此時就是在類的内部聲明了一個枚舉類型。并沒有聲明這個枚舉類型的變量。此時如果加上一個枚舉類型的變量的聲明,再來測試一下這個類的大小。其中枚舉為公有的,我們試着用 類::enum值 調用該枚舉值,看其是否能夠被調用。
- class test
- {
- public:
- enum type{One=2,Two, Three};
- test():t(One)
- {
-
- }
- type getT()
- {
- return t;
- }
- private:
- type t;
- };
-
- int _tmain(int argc, _TCHAR* argv[])
- {
- test s;
- cout << sizeof(test)<<endl;
- cout<<s.getT()<<endl;
- cout << test::Three<<endl;
- return 0;
- }
輸出:
此時類的大小是一個int型變量的大小。取得的枚舉是一個整形。可以通過類域通路到枚舉值。為什麼通過 類::enum值可以通路枚舉值?
因為該枚舉是一個常量,在編譯的時候已經被放入了常量區。調用的時候是以不需要該枚舉的變量也可以調用。
注意:枚舉類型不具備名字空間的作用。在一個作用域中在,如果兩個枚舉類型的值相同,則會編譯出錯。
- struct CEType
- {
- enum EType1 { e1, e2 };
- enum EType2 { e1, e2 };
- };
e1,e2名字相同程式會報錯。
來自為知筆記(Wiz)