C++ 的 enum 工具提供了另一種創(chuàng)建符號常量的方式努咐,這種方式可以替代 const。它還允許定義新類型,但必須按嚴格的限制進行熙揍。使用 enum 的語法與使用結構體相似。
enum DemoEnum {
demoOne,
demoTwo,
demoThree
};
默認情況下氏涩,將整數(shù)值賦給枚舉量届囚,第一個枚舉值為 0,第二個為 1是尖,依次類推意系。可以通過顯式地指定整數(shù)值來覆蓋默認值饺汹。
可以用枚舉名來聲明這種類型變量:
DemoEnum myDemoEnum;
枚舉類型變量具有一些特殊屬性:
- 1.在不進行強制類型轉(zhuǎn)換的情況下蛔添,只能將定義枚舉時使用的枚舉量賦給這種枚舉的變量:
myDemoEnum = demoThree; // 正確
myDemoEnum = 20; // 錯誤
因此,myDemoEnum 變量受到限制兜辞,只有 3 個可能的值(為保證最大的可移植性迎瞧,應將把非 enum 值賦給 enum 變量視為錯誤)。
- 2.對于枚舉逸吵,只定義了賦值操作符夹攒。具體地說,沒有為枚舉變量定義算術運算:
myDemoEnum = demoOne; // 正確
++myDemoEnum; // 錯誤
myDemoEnum = demoOne + demoTwo; // 錯誤
為了獲得最大限度的可移植性胁塞,應采納較嚴格的限制咏尝。
- 3.枚舉量是整型压语,可被提升為int類型,但int型不能自動轉(zhuǎn)換為枚舉類型:
int demoNum = demoThree; //正確
myDemoEnum = 2; //錯誤
demoNum = 4 + demoOne; //正確
demoNum = demoTwo + demoOne; //正確
- 4.如果int值是有效的编检,則可以通過強制類型轉(zhuǎn)換胎食,將它賦給枚舉變量:
myDemoEnum = DemoEnum(1); //正確
如果試圖對一個不適當?shù)闹颠M行強制類型轉(zhuǎn)換,將出現(xiàn)什么情況允懂?結果是不確定的厕怜,這意味著這樣做不會出錯,但不能以來得到的結果:
myDemoEnum = DemoEnum(88); // 結果是不確定的
5.正如看到的那樣蕾总,枚舉的規(guī)則相當嚴格粥航。實際上,枚舉更常被用來定義相關的符號常量生百,而不是新類型递雀。例如,可以用枚舉來定義 switch 語句中使用的符號常量蚀浆。
6.如果打算只使用常量缀程,而不創(chuàng)建枚舉類型的變量,則可以省略枚舉類型的名稱市俊,如下面的例子所示:
enum { red, orange, yellow, green, blue };
- 7.可以使用賦值操作符來顯示地設置枚舉量的值:
enum { red=1, orange=2, yellow=4, green=8, blue=16 };
指定的值必須是整數(shù)杨凑。也可以只顯示地定義其中一些枚舉量的值:
enum { red, orange, yellow=50, green, blue };
這里,red 在默認時為 0摆昧,后面沒有被初始化的枚舉量的值將比其前面的枚舉量大 1撩满。因此,orange 為 1绅你,green 為 51鹦牛,blue 為 52。
可以創(chuàng)建多個值相同的枚舉量:
enum { red, orange=0, yellow, green=1, blue };
其中勇吊,red、orange 都為 0窍仰,yellow汉规、green 都為 1,blue 為 2驹吮。
- 8.除了 int 類型针史,還可以將 long 類型賦給枚舉量
- 9.枚舉的取值范圍
每個枚舉都有取值范圍,通過強制類型轉(zhuǎn)換碟狞,可以將取值范圍內(nèi)的任何整數(shù)值賦給枚舉變量啄枕,即使這個值不是枚舉值。例如:
enum myColor { red=1, orange=2, yellow=4, green=8, blue=16 };
myColor flagColor;
則下面的語句是合法的:
flagColor = myColor(13);
枚舉的取值范圍定義如下族沃。首先要找出上限频祝,需要知道枚舉量的最大值泌参。找到大于這個最大值的、最小的 2 的冪常空,將它減去 1沽一,得到的便是取值范圍的上限。例如漓糙,myColor的最大值是16铣缠。在 2 的冪中,比這個數(shù)大的最小值為 32昆禽,因此取值范圍的上限為 31蝗蛙。要計算下限,需要知道枚舉量的最小值醉鳖。如果它不小于 0捡硅,則取值范圍的下限為0;否則辐棒,采用與尋找上限方式相同的方式病曾,但加上負號。例如漾根,如果最小的枚舉量為 -6泰涂,而比它小的、最大的 2 的冪是 -8(加上負號)辐怕,因此下限為 -7逼蒙。
選擇用多少空間來存儲枚舉由編譯器決定。對于取值范圍較小的枚舉寄疏,使用一個字節(jié)或更少的空間是牢;而對于包含 long 類型值的枚舉,則使用 4 個字節(jié)陕截。