一、Enum Class概述
Enum Class(又稱Scoped Enumeration,枚舉類)是C++中用於聲明枚舉類型的一種方式。與傳統的C++枚舉類型相比,Enum Class提供了更嚴謹的類型檢查、更好的可讀性和更佳的作用域管理。
二、Enum Class的定義與使用
Enum Class與普通枚舉類型不同,它們必須被顯式地定義為一個class或struct的成員,並且默認的枚舉類型是int。
enum class Color { RED, BLUE, GREEN };
上面的代碼定義了一個名為Color的枚舉類,其中包含了三個元素:RED、BLUE和GREEN。在枚舉類型被定義之後,就可以用它來聲明變量:
Color c = Color::RED; if (c == Color::RED) { cout << "The color is RED" << endl; }
三、作用域管理與類型檢查
與普通枚舉類型相比,Enum Class提供了更良好的作用域管理。聲明一個Enum Class後,其中的元素都在該Enum Class的命名空間下:
enum class Color { RED, BLUE, GREEN }; enum class Size { SMALL, MEDIUM, LARGE }; int main() { Color c = Color::RED; Size s = Size::LARGE; // c == Size::LARGE; //編譯錯誤:錯誤的枚舉類型 return 0; }
在上面的代碼中,Color和Size對元素RED都有定義。但是在main函數中,我們可以安全地使用Color::RED或Size::LARGE,不會發生衝突。如果試圖將Color類型與Size類型混淆,則編譯器會指出錯誤。
此外,Enum Class還提供了更嚴謹的類型檢查。這意味着我們無法使用某個Enum Class類型來表示另一個類型:
enum class Color { RED, BLUE, GREEN }; int main() { Color c = Color::RED; // 以下語句是非法的 // int n = static_cast(c); // int m = c; return 0; }
在上面的代碼中,我們試圖將Color類型轉換為int類型或直接賦值給int類型。由於類型不匹配,編譯器將不會通過這樣的語句。 如果必須要將Enum Class類型強制轉換,可以使用static_cast:
enum class Color { RED, BLUE, GREEN }; int main() { Color c = Color::RED; int n = static_cast(c); return 0; }
四、Enum Class的默認值
與傳統的枚舉類型相同,Enum Class的元素也有默認值。不過,與普通枚舉類型不同的是,Enum Class的默認值可以在定義時指定。如果未指定,則默認的值為0。注意,即便設置了默認值,Enum Class元素也不能隱式地轉換為整數類型,因此它們不能用作數組的索引值或函數參數。
enum class Color { RED = 1, BLUE, GREEN }; int main() { Color c = Color::BLUE; cout << static_cast(c) << endl; // 輸出值為 2 return 0; }
五、Enum Class的嵌套和前置聲明
Enum Class可以在其他class、namespace或函數中嵌套使用。 在嵌套時,需要使用作用域運算符來引用Elements。同時需要注意,在枚舉類定義前聲明變量時,需要在該變量名之前加上枚舉類名及作用域運算符。
class A { public: enum class Color { RED, BLUE, GREEN }; Color c; }; int main() { A::Color c = A::Color::RED; return 0; }
六、Enum Class的強類型枚舉
在C++20中,Enum Class提供了一種新的枚舉類型,即強類型枚舉類型(常稱為枚舉類)。與傳統的Enum Class相比,枚舉類提供了更完整的類型安全性。我們使用enum class關鍵字來定義一個枚舉類型,在此基礎上,使用關鍵字enum來定義一個枚舉類:
enum class Color : char { RED, BLUE, GREEN }; int main() { Color c = Color::RED; char red = static_cast(c); return 0; }
在上面的代碼中,枚舉類類型被指定為char,因此它只能存儲char類型的值。c實際上是一個枚舉類型的字符類型的實例。我們可以使用static_cast將c的值強制轉換為char。如果c的值不是char類型,則編譯器會報告一個錯誤。
七、總結
Enum Class提供了更強的類型安全和更好的作用域管理,同時也解決了原始枚舉的一些限制。通過使用Enum Class,我們可以更易於編寫和維護類型安全的C++代碼。
原創文章,作者:NXXHT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/325121.html