C++ 枚舉類型
枚舉類型是一種可以由用戶自定義數據集的數據類型。
注意:bool類型可以看成是C++語言提供的一個預定義的枚舉類型。
1. 枚舉類型定義
enum {};
2. 初始化
枚舉類型的每一個枚舉值都對應一個整型數,默認情況下,第一個枚舉值的值是0,然後依次增1,但也可以顯示初始化任意一個枚舉值對應的整形數,沒定義的枚舉值默認情況下在其前一個枚舉值的對應整型數上加1.
留個問題:如果多個枚舉值對應同一個整形數會怎樣?
enum Day {Sun=7, MON=1, TUE, WED, THU, FRI, SAT}
3. 枚舉變量的定義
;
或{} ;
4. 枚舉變量的使用
1)賦值
Day d1,d2;
d1 = SUN; //true
d2 = 3; //error, 但int n = SUN;也是可以的
d2 = (Day)3;//true 但這樣不安全,必須要保證該整型數屬於枚舉類型的值集,否則沒有意義
2)比較運算
MON < TUE的結果為true,運算時將其轉換為整型
3)算術運算
d2 = d1 + 1;//error,因為它d1 + 1的結果是整型
d2 = (Day)(d1 + 1);//true
4)其他
輸入輸出:可以輸入int數,使用switch,然後複製或者輸出
類下標訪問:day(0)對應的是第一個枚舉值sun
————————————————
enum枚舉量聲明、定義、使用與枚舉類詳解
眾所周知,C/C++語言可以使用#define和const創建符號常量,而使用enum工具不僅能夠創建符號常量,還能定義新的數據類型,但是必須按照一定的規則進行,下面我們一起看下enum的使用方法。
(1)首先,請看下面的語句:
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
這句話有兩個作用:
第一:聲明enumType為新的數據類型,稱為枚舉(enumeration);
第二:聲明Monday、Tuesday等為符號常量,通常稱之為枚舉量,其值默認分別為0-6。(後面會介紹怎樣顯式的初始化枚舉量的值)
(2)接著利用新的枚舉類型enumType聲明這種類型的變量:enumType Weekday'就像使用基本變量類型int聲明變量一樣,如 int a;也可以在定義枚舉類型時定義枚舉變量enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;
然而與基本變量類型不同的地方是,在不進行強制轉換的前提下,只能將定義的枚舉量賦值給該種枚舉的變量,如:Weekday = Monday;或者Weekday = Sunday;不能將其他值賦給枚舉變量,如:Weekday = 10;這是不允許的,因為10不是枚舉量。也就是說Weekday只能是定義的Monday-Sunday這些定義過的枚舉量。然而這不是絕對的,第六條會講到利用強制類型轉換將其他類型值賦給枚舉變量。
(3)上面講不能將非枚舉量賦給枚舉變量,那麼能不能將枚舉量賦給非枚舉變量呢?如:int a=Monday;這是允許的,因為枚舉量是符號常量,這裡的賦值編譯器會自動把枚舉量轉換為int類型。
(4)前面講可以對枚舉進行賦值運算,那枚舉變量能不能進行算術運算呢?
Weekday++;Weekday = Monday + Tuesday;這是非法的,因為這些操作可能導致違反類型限制,比如:Weekday = Sunday;
Weekday++;Weekday首先被賦予枚舉量中的最後一個值Sunday(值為6),再進行遞增的話,Weekday增加到7,而對於enumType類型來說,7是無效的。
總結:對於枚舉,只定義了賦值運算符,沒有為枚舉定義算術運算。
(5)不能對枚舉量進行算術運算,那麼枚舉量能不能參與其他類型變量的運算呢?int a;a = 1 + Monday;這是允許的,因為編譯器會自動把枚舉量轉換為int類型。
(6)第二條講:在不進行強制轉換的前提下,只能將定義的枚舉量賦值給該種枚舉的變量,言下之意就是可以通過強制轉換將其他類型值賦給枚舉變量:
Weekday = enumType(2);等同於:Weekday = Wednesday;但是,如果試圖將一個超出枚舉取值範圍的值通過強制轉換賦給枚舉變量,會出現什麼結果?
Weekday = enumType(20);結果將是不確定的,這麼做不會出錯,但得不到想要的結果。
步驟(二)——自定義枚舉量的值
(1)前面講通過定義enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday};
枚舉量Monday、Tuesday等的值默認分別為0-6,我們可以顯式的設置枚舉量的值:
enum enumType {Monday=1, Tuesday=2, Wednesday=3, Thursday=4, Friday=5, Saturday=6, Sunday=7};
指定的值必須是整數!
(2)也可以只顯式的定義一部分枚舉量的值:
enum enumType {Monday=1, Tuesday, Wednesday=1, Thursday, Friday, Saturday, Sunday};這樣Monday、Wednesday均被定義為1,則Tuesday=2,Thursday、Friday、Saturday、Sunday的值默認分別為2、3、4、5.總結:未被初始化的枚舉值的值默認將比其前面的枚舉值大1。
(3)第二條還說明另外一個現象,就是枚舉量的值可以相同。
步驟(三)——枚舉的取值範圍
前面講到可以通過強制轉換將其他類型值賦給枚舉變量: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小於最小枚舉量-5,且為2的冪);
步驟(四)——枚舉應用
個人覺得枚舉和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;這樣定義三個常量一樣。然後用的話就是int no = one。
————————————————————————————————————————————————————————
一、簡述
強類型枚舉(Strongly-typed enums),號稱枚舉類型,是C++11中的新語法,用以解決傳統C++枚舉類型存在的缺陷。傳統C++中枚舉常量被暴漏在外層作用域中,這樣若是同一作用域下有兩個不同的枚舉類型,但含有相同的枚舉常量也是不可的,比如:
<code>enum Side{Right,Left};enum Thing{Wrong,Right};/<code>
這是不能一起用的。
另外一個缺陷是傳統枚舉值總是被隱式轉換為整形,用戶無法自定義類型。C++11中的強類型枚舉解決了這些問題。
—————————————————————————
二、強類型枚舉
強類型枚舉使用enum class語法來聲明,如下:
<code>enum class Enumeration{ VAL1, VAL2, VAL3=100, VAL4};/<code>
這樣,枚舉類型時安全的,枚舉值也不會被隱式轉換為整數,無法和整數數值比較,比如(Enumeration::VAL4==10會觸發編譯錯誤)。
另外枚舉類型所使用的類型默認為int類型,也可指定其他類型,比如:
<code>enum calss Enum:unsigned int{VAL1,VAL2};/<code>
正如前面所說,強類型枚舉能解決傳統枚舉不同枚舉類下同枚舉值名的問題,使用枚舉類型的枚舉名時,必須指明所屬範圍,比如:Enum::VAL1,而單獨的VAL1則不再具有意義。
還有一點值得說明的是C++11中枚舉類型的前置聲明也是可行的,比如:
<code>enum calss Enum;enum class Enum1:unsigned int;/<code>
—————————————————————————
三、項目中的強類型枚舉代碼片段
1、圖像處理
<code>enum class Color{RED,BLUE,YELLOR,BLACK,WHITE};/<code>
2.交通燈
<code>enum class TrafficLight{RED,YELLOR,GREEN};/<code>
強類型枚舉值具有傳統枚舉的功能——命名枚舉值,同時又具有類的特點——具有類域的成員和無法進行默認的類型轉換。所以也稱之為枚舉類——enmu class
枚舉類的底層數據必須是有符號或無符號整型,比如char unsigned int unsigned long,默認為int。
<code>enmu class Clolor:char; //前置聲明枚舉類void Foo(Color*p); //前置聲明的使用//....................enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置聲明的定義/<code>
通過分享實用的計算機編程語言乾貨,推動中國編程到2025年基本實現普及化,使編程變得全民皆知,最終實現中國編程之崛起,這裡是中國編程2025,感謝大家的支持。
原文鏈接:https://blog.csdn.net/haitaolang/article/details/70014201
閱讀更多 中國編程2025 的文章