enum class 和 enum比較
阿新 • • 發佈:2020-10-04
兩種型別比較
/ | 不限定作用域 | 限定作用域 |
---|---|---|
作用域範圍 | 列舉成員和列舉型別作用域相同 | 列舉成員的名字遵循常規作用域準則 |
自動轉換 | 列舉型別或成員可以自動轉換成整形 | 不進行隱式轉換 |
預設型別 | 不存在 | int |
前置宣告 | 需要指定成員型別才可以宣告 | 可以用預設型別直接宣告 |
- 一般來說大括號裡的內容屬於一個作用域,但在不限定作用域的列舉型別中,列舉成員的作用域是在列舉型別所屬作用域內,這樣就可能洩露名字
enum Color {black, white};
auto white = false; //錯誤,white已經在範圍內被聲明瞭。
- 前置宣告的好處:
降低編譯依賴性,如果列舉型別中的成員要增刪,可能整個系統都要重新編譯,即使程式只有一個地方使用了該列舉型別。
使用限定作用域範圍的列舉型別好處:
- 降低名字衝突。
- 更便捷的前置宣告。
- 列舉量是更強型別的,不能隱式轉換型別,程式碼更安全。
使用不限定作用域範圍的列舉型別好處:
- 因為列舉成員可以自動轉換成整數型別,在需要傳入整數的程式中可以直接寫列舉成員,可讀性高。
補充:
- 不限定作用域的列舉型別也可以前置宣告,但需要定義預設型別。
- 在需要傳入整數的函式中想用限定作用域範圍的列舉型別成員,可以顯示的將列舉成員轉換型別或者寫一個模板函式,傳入列舉成員,返回整數值。
定義
enum有名字就可以定義並初始化該型別的成員,只能用enum成員或者同類型enum物件來初始化。如果未命名,則只能在定義enum的時候定義物件。