天天看點

C++類中的枚舉類型

        在看effective c++的時候,其中第二條邊指出。盡量使用const ,enum代替define。在寫程式的時候,需要入參為裝置類型,第一反應是枚舉一個裝置類型,并以名字命名。但是有一個問題挺困惑的,類中的枚舉到底是以什麼形式存在的?枚舉變量需不需要配置設定記憶體?

    帶着這個問題,咱們來做一個實驗。

  1. class test
  2. {
  3. public:
  4. enum type{One,Two, Three};
  5. private:
  6. };
  7. int _tmain(int argc, _TCHAR* argv[])
  8. {
  9. cout << sizeof(test)<<endl;
  10. return 0;
  11. }

輸出:

        想想其實也很容易明白,此時就是在類的内部聲明了一個枚舉類型。并沒有聲明這個枚舉類型的變量。此時如果加上一個枚舉類型的變量的聲明,再來測試一下這個類的大小。其中枚舉為公有的,我們試着用 類::enum值 調用該枚舉值,看其是否能夠被調用。

  1. class test
  2. {
  3. public:
  4. enum type{One=2,Two, Three};
  5. test():t(One)
  6. {
  7. }
  8. type getT()
  9. {
  10. return t;
  11. }
  12. private:
  13. type t;
  14. };
  15. int _tmain(int argc, _TCHAR* argv[])
  16. {
  17. test s;
  18. cout << sizeof(test)<<endl;
  19. cout<<s.getT()<<endl;
  20. cout << test::Three<<endl;
  21. return 0;
  22. }

輸出:

此時類的大小是一個int型變量的大小。取得的枚舉是一個整形。可以通過類域通路到枚舉值。為什麼通過 類::enum值可以通路枚舉值?

    因為該枚舉是一個常量,在編譯的時候已經被放入了常量區。調用的時候是以不需要該枚舉的變量也可以調用。

注意:枚舉類型不具備名字空間的作用。在一個作用域中在,如果兩個枚舉類型的值相同,則會編譯出錯。

  1. struct CEType
  2. {
  3. enum EType1 { e1, e2 };
  4. enum EType2 { e1, e2 };
  5. };

e1,e2名字相同程式會報錯。

來自為知筆記(Wiz)