枚舉
C++11有作用域枚舉和無作用域枚舉
無作用域枚舉
特點
-
全局作用域:無作用域枚舉的成員(枚舉值)在包含它們的作用域內是直接可見的,不需要使用枚舉類型名稱作為前綴。
-
隱式類型轉換:無作用域枚舉的成員可以隱式地轉換為整數類型,這使得它們可以直接用在需要整數值的地方。
-
底層類型:在 C++98/03 中,無作用域枚舉的底層類型是由編譯器決定的,并且通常是足夠存儲所有枚舉值的最小整數類型。在 C++11 及以后的版本中,可以顯式指定無作用域枚舉的底層類型。
有作用域枚舉
特點
-
作用域限制:有作用域枚舉的成員必須通過枚舉類型名稱訪問。這樣可以防止命名沖突,也更清晰地表達了代碼意圖。
-
強類型:與無作用域枚舉不同,有作用域枚舉不支持隱式轉換到整數類型。這增加了類型安全性,避免了某些類型錯誤。
-
底層類型指定:在有作用域枚舉中,可以顯式地指定底層類型。這使得枚舉在不同平臺間具有更好的一致性和可控性。
-
前向聲明:有作用域枚舉支持前向聲明,這意味著可以在不提供成員列表的情況下聲明枚舉類型。
有作用域枚舉下 指定作用域
無作用域枚舉易發生名稱沖突
現代C++盡量用有作用域枚舉
枚舉項的性質
枚舉項缺省用0初始化 依次遞增
枚舉項底層是整數值
可以用常量表達式修改枚舉項的值
改變枚舉項某一項 后面的項則依次遞增
古老的C++代碼會采用枚舉的手段 定義constexpr static
指定枚舉項底層類型 表明尺寸
如下 sizeof(color)打印出來將會變成1
枚舉項可以隱式轉換成整數類型
但是反過來整數不能轉換成枚舉項
如下圖 編譯不通過
不允許整數隱式轉換成枚舉的原因是容易產生歧義 導致程序錯誤
如下 fun(100)是寫錯還是真是意圖 導致歧義 其次 C++有作用域枚舉是強類型的
如果要用就要static_cast顯示類型轉換
枚舉的定義與聲明
無作用域枚舉聲明
有作用域枚舉聲明?
有作用域枚舉缺省類型是int
聯合體
將多個類型合并到一起省空間
枚舉與聯合一起使用
匿名聯合
類似于無作用域
C++11聯合體定義非內建類型
C++11 引入了能夠在聯合體中使用非內建類型的能力,這些類型包括具有自定義構造函數、析構函數、拷貝構造函數和拷貝賦值運算符的類。
關鍵特性
-
構造和析構:在聯合體中使用具有非平凡構造函數和析構函數的類型時,必須顯式地調用這些函數。這是因為聯合體不會自動調用成員的構造函數和析構函數。
-
有限的類型:雖然 C++11 允許在聯合體中使用更復雜的類型,但并不是所有類型都可以用。特別是,不能在聯合體中使用具有虛函數或虛基類的類型。
-
顯式管理:你需要手動管理聯合體中對象的生命周期,包括合適地調用構造函數和析構函數。