C++:枚舉類的使用案例及場景

一、使用案例

在C++中,枚舉類(也稱為枚舉類型或enum class)是C++11及以后版本中引入的一種更加強大的枚舉類型。與傳統的枚舉(enum)相比,枚舉類提供了更好的類型安全性和作用域控制。下面是一個使用枚舉類的案例,這個案例模擬了一個簡單的交通燈系統。

#include <iostream>  // 定義一個枚舉類來表示交通燈的狀態  
enum class TrafficLight {  RED,    // 紅燈  YELLOW, // 黃燈  GREEN    // 綠燈  
};  // 一個函數,用于打印當前交通燈的狀態  
void printTrafficLight(TrafficLight light) {  switch (light) {  case TrafficLight::RED:  std::cout << "紅燈亮,請停車等待" << std::endl;  break;  case TrafficLight::YELLOW:  std::cout << "黃燈亮,請準備停車" << std::endl;  break;  case TrafficLight::GREEN:  std::cout << "綠燈亮,可以通行" << std::endl;  break;  default:  std::cout << "未知狀態" << std::endl;  }  
}  int main() {  // 使用枚舉類  TrafficLight currentLight = TrafficLight::RED;  printTrafficLight(currentLight);  // 嘗試修改交通燈狀態  currentLight = TrafficLight::GREEN;  printTrafficLight(currentLight);  // 嘗試隱式轉換(這是不允許的,因為使用了enum class)  // 下面的代碼會編譯失敗  // printTrafficLight(2); // 錯誤:無法從'int'轉換為'TrafficLight'  return 0;  
}

在這個例子中,TrafficLight是一個枚舉類,它有三個成員:REDYELLOWGREEN,分別代表交通燈的不同狀態。printTrafficLight函數接受一個TrafficLight類型的參數,并根據參數的值打印出相應的狀態信息。

與普通的枚舉(enum)相比,enum class提供了更強的類型檢查。在上面的代碼中,如果你嘗試將整數直接傳遞給printTrafficLight函數(如printTrafficLight(2);),編譯器會報錯,因為enum class類型的值不能直接由整數隱式轉換而來,這有助于減少因類型不匹配而導致的錯誤。

此外,由于enum class的成員默認是private的,它們的作用域被限制在枚舉類內部,這有助于避免命名沖突,并提高了代碼的可讀性和可維護性。在需要時,可以通過::操作符來訪問枚舉類的成員,如TrafficLight::RED

二、使用場景

枚舉類(enum class)的主要目的和優點包括:

  1. 類型安全:與傳統的枚舉(enum)相比,枚舉類提供了更強的類型安全性。枚舉類的成員不會隱式地轉換為整數或與其他枚舉類型的成員進行比較,這有助于減少因類型不匹配而導致的錯誤。

  2. 作用域控制:枚舉類的成員默認具有枚舉類的作用域,這有助于避免命名沖突。要使用枚舉類的成員,通常需要使用枚舉類名和::操作符(例如TrafficLight::RED)。

  3. 可定義性和可擴展性:枚舉類可以像其他類一樣,擁有成員函數(包括構造函數、析構函數和操作符重載等)。這提供了更多的靈活性和可擴展性。

  4. 清晰的語義:枚舉類提供了一種將一組命名的整數常量組織在一起的方式,使得代碼更加清晰易懂。枚舉類的成員名通常能夠清晰地表達其代表的語義。

然而,枚舉類聲明的對象并不僅限于與枚舉類內部定義的數據進行對比。它們還可以用于各種需要這些枚舉值的場景,比如:

  • 作為函數的參數或返回值,以指示函數的狀態或執行的結果。
  • 作為類的成員變量,以表示對象的狀態或屬性。
  • 在條件語句(如ifswitch)中作為條件表達式,以根據枚舉值執行不同的代碼路徑。
  • 在循環中作為迭代器的值,盡管這種情況較少見,但在某些特定場景下可能會用到。

因此,雖然將枚舉類聲明的對象與枚舉類內部定義的數據進行對比是枚舉類的一種常見用法,但枚舉類的用途遠不止于此。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38638.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38638.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38638.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(linux系統服務)Linux下yum源配置實戰

一、Linux下軟件包的管理 1、軟件安裝方式 ① RPM包管理&#xff08;需要單獨解決依賴問題&#xff09; ② YUM包管理&#xff08;需要有網絡及YUM倉庫的支持&#xff0c;會自動從互聯網下載軟件&#xff0c;自動解決依賴&#xff09; ③ 源碼安裝&#xff08;安裝過程比較…

總體設計在軟件設計中的意義

總體設計&#xff08;High-Level Design, HLD&#xff09;是軟件開發生命周期中的一個關鍵階段&#xff0c;旨在從宏觀層面定義系統的結構和主要組件。總體設計的目標是為詳細設計和實現提供一個清晰的框架和藍圖。 總體設計的意義 明確系統架構&#xff1a;總體設計幫助開發…

基于Java的外賣點餐系統設計與實現

作者介紹&#xff1a;計算機專業研究生&#xff0c;現企業打工人&#xff0c;從事Java全棧開發 主要內容&#xff1a;技術學習筆記、Java實戰項目、項目問題解決記錄、AI、簡歷模板、簡歷指導、技術交流、論文交流&#xff08;SCI論文兩篇&#xff09; 上點關注下點贊 生活越過…

深?理解 JVM 底層原理、垃圾回收機制,能通過mat、jstat進行JVM參數調優

深入理解JVM&#xff08;Java虛擬機&#xff09;底層原理和垃圾回收機制是Java開發者和系統管理員的重要技能&#xff0c;尤其是在性能調優方面。下面是一些關鍵點&#xff0c;幫助你更好地理解這些概念&#xff1a; ### JVM 底層原理 1. **類加載機制**&#xff1a;JVM如何加…

java+mysql教師管理系統

完整源碼地址 教師信息管理系統使用命令行交互的方式及數據庫連接實現教師信息管理系統&#xff0c;該系統旨在實現教師信息的管理&#xff0c;并根據需要進行教師信息展示。該軟件的功能有如下功能 (1)基本信息管理(教師號、姓名、性別、出生年月、職稱、學歷、學位、教師類型…

25西安電子科技大學研究生政策(最新)

25西安電子科技大學研究生政策&#xff08;最新&#xff09; 01全國研究生報名情況 全國研究生報名人數438萬&#xff0c;首次下降超36萬人。 02西電研究生全日制/非全日制報名情況 西電碩士研究生報考錄取情況&#xff08;包含全日制、非全日制&#xff09;&#xff0c;2024年…

python-數據容器對比總結

基于各類數據容器的特點&#xff0c;它們的應用場景如下&#xff1a; 數據容器的通用操作 - 遍歷 數據容器的通用統計功能 容器的通用轉換功能 容器通用排序功能 容器通用功能總覽

C-特性和新特性

C特性和新特性 C11 C11是C編程語言的一個重要標準版本&#xff0c;是C98標準發布后13年來的第一次重大修正&#xff0c;它引入了許多新特性和改進&#xff0c;極大地增強了C語言的表達能力和開發效率。 C11是C編程語言的一個重要標準版本&#xff0c;由國際標準化組織(ISO)和…

如何在Java中實現自定義數據結構:從頭開始

如何在Java中實現自定義數據結構&#xff1a;從頭開始 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將探討如何在Java中實現自定義數據結構&#xff…

一文徹底搞懂Transformer - Input(輸入)

一、輸入嵌入&#xff08;Input Embedding&#xff09; 詞嵌入&#xff08;Word Embedding&#xff09;&#xff1a;詞嵌入是最基本的嵌入形式&#xff0c;它將詞匯表中的每個單詞映射到一個固定大小的向量上。這個向量通常是通過訓練得到的&#xff0c;能夠捕捉單詞之間的語義…

HTTP入門

入門HTTP協議 1. 原理介紹 爬蟲就是用程序模擬瀏覽器的行為&#xff0c;發送請求給服務器&#xff0c;獲取網頁的內容&#xff0c;解析網頁數據。 要學會爬蟲&#xff0c;先要了解瀏覽器是如何和服務器交流的。瀏覽器通過HTTP協議和服務器交流。 2. HTTP協議簡介 2.1…

第4篇 區塊鏈的優勢與挑戰:為什么區塊鏈如此重要?

區塊鏈聽起來像是一種高科技的魔法&#xff0c;很多人都想知道它到底是怎么回事&#xff0c;為什么會引起如此大的關注。今天&#xff0c;我們就來揭開區塊鏈的神秘面紗&#xff0c;看看它的優勢和挑戰&#xff0c;順便聊聊為什么它會變得如此重要。 優勢篇 1. 去中心化&…

【pg】去除pg數據庫字段值中的空格

如何批量去除PostgreSQL數據庫字段值中的空格 在處理數據庫中的數據時&#xff0c;經常會遇到字段值末尾帶有多余空格的問題。這些空格可能是用戶輸入錯誤或數據遷移過程中引入的&#xff0c;可能會影響數據的準確性和一致性。本文將介紹如何使用 PostgreSQL 的 SQL 語句批量去…

The Forest Enemy Pack(2D動畫角色游戲模型)

這個包包含14個適用于platformer和2d rpg游戲的動畫角色。 動畫總幀數:1785 用于動畫的所有精靈都具有透明背景,并準備有1500x1200和750x600兩種尺寸。 對于每個角色,你也可以找到具有單獨身體部位的精靈表,這樣你就可以輕松地制作自己的動畫。它們有PNG和PSD格式。 示例場…

對MVC的理解以及如何實現一個簡單的MVC

IOC 容器與 Controller&#xff1a; 在 Spring 框架中&#xff0c;所有的 Controller 都會被 Spring 的 IOC 容器管理。當應用程序啟動時&#xff0c;Spring 會掃描所有帶有 Controller 注解的類&#xff0c;并將它們作為 Bean 注冊到 IOC 容器中。 方法掃描與 Dispatcher&am…

強化學習-5 策略梯度、Actor-Critic 算法

文章目錄 1 基于價值&#xff08; value-based \text{value-based} value-based &#xff09;算法的缺點2 策略梯度算法2.1 解釋2.1.1 分母和分子相消2.1.2 對數函數的導數2.1.3 組合公式2.1.4 總結 3 REINFORCE算法4 策略梯度推導進階4.1 平穩分布4.2 基于平穩分布的策略梯度…

Python游戲腳本開發之大漠插件

自動化 文章目錄 自動化前言一、開發環境二、免注冊調用三、創建大漠對象四、注冊五、大漠功能調用六、整體代碼 前言 大漠插件是集前后臺&#xff0c;文字識別&#xff0c;圖色&#xff0c;鍵鼠&#xff0c;窗口&#xff0c;內存&#xff0c;DX&#xff0c;Call等功能于一身的…

HSP_13章 Python_魔術方法

文章目錄 P132 魔術方法1. 魔術方法的基本介紹2. 常見的魔術方法2.1 __str__2.2 __eq__2.3 其它的幾個魔術方法 P132 魔術方法 參考文檔 1. 魔術方法的基本介紹 2. 常見的魔術方法 2.1 str # 請輸出Monster[name&#xff0c;job&#xff0c;sal]對象的屬性信息 #可以根據需要…

(1, ‘[SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1124)

WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by SSLError(SSLError(1, [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1124))): /pypi/simple/urllib3/ pip install的時候遇到這個錯誤 第一步…

競賽選題 交通目標檢測-行人車輛檢測流量計數 - 競賽選題

文章目錄 0 前言1\. 目標檢測概況1.1 什么是目標檢測&#xff1f;1.2 發展階段 2\. 行人檢測2.1 行人檢測簡介2.2 行人檢測技術難點2.3 行人檢測實現效果2.4 關鍵代碼-訓練過程 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 畢業設計…