python合適做網(wǎng)站嗎海外網(wǎng)絡(luò)推廣方案
C++初學(xué)者指南第一步—6.枚舉和枚舉類
文章目錄
- C++初學(xué)者指南第一步---6.枚舉和枚舉類
- 1.作用域的枚舉(enum class類型)(C++11)
- 2.無(wú)作用域的枚舉(enum類型)
- 3.枚舉類的基礎(chǔ)類型
- 4.自定義枚舉類映射
- 5.和基礎(chǔ)類型的互相轉(zhuǎn)換
1.作用域的枚舉(enum class類型)(C++11)
語(yǔ)法:
enum class name { enumerator1, enumerator2, … enumeratorN };
默認(rèn)值:每個(gè)枚舉類映射到從 0 到 N-1 的整數(shù)
enum class day { mon, tue, wed, thu, fri, sat, sun };
day d = day::mon;
d = day::tue; // OK
d = wed; // Err! 編譯錯(cuò)誤: 'wed' 只能在day作用域內(nèi)
- 僅限于命名范圍的枚舉類
- 無(wú)法像某些其他語(yǔ)言那樣查詢枚舉的屬性
2.無(wú)作用域的枚舉(enum類型)
語(yǔ)法:
enum name { enumerator1, enumerator2, … enumeratorN };
注意缺少關(guān)鍵字“class”。
enum day { mon, tue, wed, thu, fri, sat, sun };
day d = mon; // OK!, 枚舉值 "mon" 沒(méi)有作用域
int i = wed; // OK!, i = 2
enum stars { sun, … }; // Err! 編譯錯(cuò)誤:名稱沖突
- 不局限于作用域的枚舉?名稱沖突
- 危險(xiǎn)的隱式轉(zhuǎn)換為基礎(chǔ)類型
- 無(wú)法像某些其他語(yǔ)言那樣查詢枚舉的屬性
注意一下enum class和enum類型的區(qū)別,enum枚舉類型從C語(yǔ)言開始就有了,C++中也繼承了這一類型,那為什么還要增加enum class呢,主要有以下幾個(gè)原因:
- 類型安全性:
enum class 是一種強(qiáng)類型枚舉(strongly typed enum)。它擁有更好的類型安全性,因?yàn)樗拿杜e值是被限定在枚舉類型內(nèi)部的。
傳統(tǒng)的 enum 是一種弱類型枚舉(weakly typed enum)。它的枚舉值可以隱式地轉(zhuǎn)換為整型,容易造成意外的轉(zhuǎn)換和錯(cuò)誤。 - 命名空間:
enum class 的枚舉值是限定在該枚舉類型的命名空間中的。要訪問(wèn)枚舉值需要使用 EnumName::ValueName 的形式。
enum 的枚舉值直接存在于全局命名空間中,可以直接使用 ValueName 的形式訪問(wèn)。 - 默認(rèn)基礎(chǔ)類型:
enum class 的默認(rèn)基礎(chǔ)類型是 int。但可以使用 enum class EnumName : underlying_type; 的形式指定其他整數(shù)類型作為基礎(chǔ)類型。
enum 的默認(rèn)基礎(chǔ)類型也是 int,但不能直接指定其他基礎(chǔ)類型。 - 作用域:
enum class 的作用域僅限于該枚舉類型本身。
enum 的作用域會(huì)"污染"全局命名空間。
注意:避免使用無(wú)限定作用域的枚舉
3.枚舉類的基礎(chǔ)類型
- 必須是整數(shù)類型(char、short、long、…)
- 默認(rèn)是int型
// 7個(gè)值 ? char類型應(yīng)該足夠了
enum class day : char {mon, tue, wed, thu, fri, sat, sun
};
// 不超過(guò)10,000 ? short類型應(yīng)該足夠了
enum class language_ISO639 : short {abk, aar, afr, aka, amh, ara, arg, …
};
4.自定義枚舉類映射
- 可以顯式設(shè)置枚舉類值
- 不需要以 0 開頭
- 某些值可以省略
- 可以是部分的(只有一些具有枚舉值的枚舉器)
注意:如果顯式設(shè)置枚舉類的枚舉值,請(qǐng)對(duì)所有枚舉類的枚舉執(zhí)行此操作
enum class month {jan = 1, feb = 2, mar = 3, apr = 4, may = 5, jun = 6, jul = 7, aug = 8, sep = 9, oct = 10, nov = 11, dec = 12
};
enum class flag {A = 2, B = 8, C = 5, D, E, F = 25
};
5.和基礎(chǔ)類型的互相轉(zhuǎn)換
enum class month {jan = 1, feb = 2, mar = 3, apr = 4, may = 5, jun = 6, jul = 7, aug = 8, sep = 9, oct = 10, nov = 11, dec = 12
};
枚舉 → 整數(shù) | 整數(shù)→枚舉 |
int i = static_cast(month::mar); // i: 3 | int i = 0; cin >> i; // 確定 i ≥ 1 and ≤ 12 … month m1 = static_cast(i); |
附上原文鏈接
如果文章對(duì)您有用,請(qǐng)隨手點(diǎn)個(gè)贊,謝謝 ^_^ !
不來(lái)張圖片就文章標(biāo)題就很丑!