網站首頁 編程語言 正文
枚舉類型是將一組有限的整數常量組織在一起用以描述變量可取值范圍的一種數據類型。C++中有兩種類型的枚舉:不限定作用域的枚舉類型和限定作用域的枚舉類型。限定作用域的枚舉類型是C++11標準引入的新類型。
● 限定作用域枚舉類型是為了彌補不限定作用域枚舉類型的不足而出現的,不限定作用域的枚舉類型不是類型安全的,主要表現在如下幾個方面:
● 不限定作用域的枚舉類型中的枚舉成員被視為整數,兩種不同的枚舉類型之間可以進行比較。兩種不同類型的數據進行比較,可能帶來數據類型轉換,引起數據表示不完整。
● 不限定作用域枚舉所使用的整數類型及其大小都由實現方法定義,皆無法明確指定。
● 不限定作用域枚舉類型的枚舉成員與枚舉類型外部數據處在同一個作用域范圍內,多個枚舉類型不能有同名的枚舉成員。
C++11標準引入的限定作用域的枚舉類型,其定義方式如下所示:
enum class 枚舉類型名稱 {枚舉成員1, 枚舉成員2, …, 枚舉成員n};
相對于不限定作用域的枚舉類型,限定作用域的枚舉類型定義的枚舉成員在枚舉類型作用域外不可訪問。
//定義不限定作用域枚舉類型 enum color {red, yellow, green}; //錯誤,不限定作用域枚舉成員不能與其它枚舉類型成員同名 enum stoplight{red, yellow, green}; //正確,限定作用域枚舉成員的作用域限定在類型內 enum class newcolor {red, yellow, green}; //正確,不限定作用域的枚舉類型外可以使用枚舉成員 color e_color = green; //錯誤,限定作用域的枚舉成員在類型外不可訪問 //雖然color類型的green成員可訪問,但是color與newcolor類型不同,不可賦值 newcolor ec_color = green;
在舊標準中,枚舉變量可以使用整數常量進行賦值,但在C++11標準中,要想初始化枚舉類型對象或對枚舉對象賦值,必須使用該類型的一個枚舉成員或該類型的一個對象。示例代碼如下所示:
enum color {red, yellow, green}; enum class newcolor {red, yellow, green}; color e_var1 = 1; //錯誤,1不是枚舉類型值 color e_var2 = red; //正確,red是color類型的枚舉值 color e_var3 = e_var2; //正確,同類型數據之間的賦值 newcolor e_nvar1 = newcolor::red; //正確,red是newcolor類型的枚舉值
不限定作用域的枚舉類型對象或枚舉成員可以自動轉化為整型,因此可以在需要整數的地方使用它們,限定作用域的枚舉類型卻沒有此特點。示例代碼如下所示:
int i = color::red; //正確,不限定作用域的枚舉成員可轉化為整數 int j = newcolor::red; //錯誤,限定作用域的枚舉成員不可轉化為整數
C++11新標準除了增加了限定作用域枚舉類型外,還改進了原有的不限定作用域枚舉類型的定義形式:
1、枚舉類型中枚舉成員的類型可以顯式指定,指定方式是在枚舉類型名稱后加冒號和枚舉成員類型。
enum intvalues:unsigned long long{ chartype = 255, shorttype = 65535, inttype = 4295967295, longtype = 4294967295ul, longlongtype = 18446744073709551615ul };
若不指定枚舉成員類型,限定作用域枚舉類型成員默認為int,不限定作用域枚舉類型成員不存在默認類型,能夠確定的是成員類型足夠大到能容納所有成員。指定了枚舉成員類型后,若某一枚舉成員值超出了該類型所能容納的范圍,將引發錯誤。
2、在C++11 中,可以提前聲明enum。enum的前置聲明必須指定枚舉成員類型,隱式指定或顯式指定均可。
enum etype1; //錯誤,不限定作用域枚舉類型的前置聲明應指定成員類型 enum etype2:unsigned int; //正確 enum class etype3; //正確,限定作用域枚舉類型成員有默認類型int enum class etype4:unsigned int; //正確,前置聲明指定枚舉成員類型
與所有的聲明語句一樣,枚舉的聲明和定義中描述的成員類型必須一致,另外不能在同一個上下文中先聲明一個不限定作用域的枚舉類型再聲明一個同名的限定作用域枚舉類型。
enmu class Clolor:char; //前置聲明枚舉類 void Foo(Color*p); //前置聲明的使用 //.................... enum class Color:char{RED,GREEN,BLACK,WHITE}; //前置聲明的定義
參考鏈接:
原文鏈接:https://www.cnblogs.com/2018shawn/p/15848879.html
相關推薦
- 2022-09-25 navicat連接遠程服務器報錯代碼:10038
- 2022-02-04 不同的Map任務之間不會進行通信
- 2023-06-13 Python?Beautiful?Soup模塊使用教程詳解_python
- 2022-03-27 centos7安裝mongo數據庫的方法(mongo4.2.8)_MongoDB
- 2022-12-28 Python標準庫之urllib和urllib3的使用及說明_python
- 2022-08-13 Flutter實現不同縮放動畫效果詳解_Android
- 2023-04-22 Python中DataFrame與內置數據結構相互轉換的實現_python
- 2022-04-02 C#實現NPOI的Excel導出詳解_C#教程
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支