C++之enum列舉量宣告、定義、使用與列舉類詳解
前面講到可以通過強制轉換將其他型別值賦給列舉變數:Weekday = enumType(2);這是合法的;但是Weekday = enumType(20);是非法的。這裡涉及列舉取值範圍的概念:列舉的上限是 大於最大列舉量的 最小的2的冪,減去1;
列舉的下限有兩種情況:一、列舉量的最小值不小於0,則列舉下限取0;二、列舉量的最小值小於0,則列舉下限是 小於最小列舉量的 最大的2的冪,加上1。
舉例來講:
假如定義 enum enumType1 { First=-5,Second=14,Third=10 };則列舉的上限是16-1=15(16大於最大列舉量14,且為2的冪); 列舉的下限是-8+1=-7(-8小於最小列舉量
步驟(四)——列舉應用
個人覺得列舉和switch是最好的搭檔:enum enumType{Step0, Step1, Step2}Step=Step0;//注意這裡在宣告列舉的時候直接定義了列舉變數Step,並初始化為Step0
switch (Step)
{
case Step0:{...;break;}
case Step1:{...;break;}
case Step2:{...;break;}
default:break;
}
另外列舉還有一種少見的用法是 enum { one ,two ,three}; 就是不指定一個名字,這樣我們自然也沒法去定義一些列舉型別了。此時就相當於static const int one = 0;這樣定義三個常量一樣。
————————————————————————————————————————————————————————
一、簡述
強型別列舉(Strongly-typed enums),號稱列舉型別,是C++11中的新語法,用以解決傳統C++列舉型別存在的缺陷。傳統C++中列舉常量被暴漏在外層作用域中,這樣若是同一作用域下有兩個不同的列舉型別,但含有相同的列舉常量也是不可的,比如:
enum Side{Right,Left};
enum Thing{Wrong,Right};
這是不能一起用的。 另外一個缺陷是傳統列舉值總是被隱式轉換為整形,使用者無法自定義型別。C++11中的強型別列舉解決了這些問題。
—————————————————————————
二、強型別列舉
強型別列舉使用enum class語法來宣告,如下:
enum class Enumeration{
VAL1,
VAL2,
VAL3=100,
VAL4
};
這樣,列舉型別時安全的,列舉值也不會被隱式轉換為整數,無法和整數數值比較,比如(Enumeration::VAL4==10會觸發編譯錯誤)。
另外列舉型別所使用的型別預設為int型別,也可指定其他型別,比如:
enum calss Enum:unsigned int{VAL1,VAL2};
正如前面所說,強型別列舉能解決傳統列舉不同列舉類下同列舉值名的問題,使用列舉型別的列舉名時,必須指明所屬範圍,比如:Enum::VAL1,而單獨的VAL1則不再具有意義。
還有一點值得說明的是C++11中列舉型別的前置宣告也是可行的,比如:
enum calss Enum;
enum class Enum1:unsigned int;
—————————————————————————三、專案中的強型別列舉程式碼片段
1、影象處理
enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};
2.交通燈
enum class TrafficLight{RED,YELLOR,GREEN};
強型別列舉值具有傳統列舉的功能——命名列舉值,同時又具有類的特點——具有類域的成員和無法進行預設的型別轉換。所以也稱之為列舉類——enmu
class
列舉類的底層資料必須是有符號或無符號整型,比如char unsigned int unsigned long,預設為int。
3.前置宣告應用
enmu class Clolor:char; //前置宣告列舉類
void Foo(Color*p); //前置宣告的使用
//....................
enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置宣告的定義