枚舉是c++++中一種用戶自定義的數(shù)據(jù)類型,用于將一組整型常量以可讀性更強的方式命名,最常見的用途是表示固定選項的狀態(tài)或類別,默認(rèn)值從0開始遞增,也可手動指定數(shù)值,如enum status { success = 0, warning = 5, Error }; 定義枚舉的基本語法為enum 枚舉名 { 值列表 }; 推薦使用enum class來創(chuàng)建作用域枚舉,避免命名沖突,如enum class day { monday, tuesday… }; 使用枚舉的三大好處包括:1. 替代魔法數(shù)字提高代碼可讀性,例如用day::saturday判斷周末;2. 作為狀態(tài)標(biāo)識符,如requeststatus表示網(wǎng)絡(luò)請求狀態(tài)并配合switch處理不同情況;3. 避免全局變量污染,通過enum class使不同枚舉中的相同名稱共存;使用時需注意:不要混用不同枚舉值,盡量使用enum class提升類型安全,顯式設(shè)置初始值有助于維護,且c++不支持直接輸出枚舉名稱為字符串,需自行實現(xiàn)映射。
在C++中,enum(枚舉)是一種用戶自定義的數(shù)據(jù)類型,它可以讓一組整型常量以更具可讀性的方式命名。簡單來說,它的作用是把數(shù)字和名字綁定起來,方便理解和使用。
什么是枚舉?
枚舉最常見的用途是表示一些有固定選項的狀態(tài)或類別。比如顏色、星期幾、錯誤碼等。
默認(rèn)情況下,枚舉值從0開始遞增:
立即學(xué)習(xí)“C++免費學(xué)習(xí)筆記(深入)”;
enum Color { red, // 0 GREEN, // 1 BLUE // 2 };
你也可以手動指定某個值,后面的會繼續(xù)遞增:
enum Status { SUCCESS = 0, WARNING = 5, ERROR // 這里就是6 };
如何定義一個枚舉?
定義一個枚舉的基本語法如下:
enum 枚舉名 { 值1, 值2, ... };
還可以加上 class 或 Struct 的關(guān)鍵字來創(chuàng)建“作用域枚舉”,避免名字沖突:
enum class Day { Monday, Tuesday, Wednesday };
這樣在使用的時候就需要帶上作用域:
Day today = Day::Monday;
枚舉怎么用?
1. 替代魔法數(shù)字,提高代碼可讀性
比如寫一個函數(shù)判斷今天是否是周末:
enum class Day { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday }; bool isWeekend(Day day) { return day == Day::Saturday || day == Day::Sunday; }
比起用數(shù)字 5 和 6 來判斷,這種寫法更容易理解也更安全。
2. 作為狀態(tài)標(biāo)識符
在網(wǎng)絡(luò)請求中,可以用枚舉表示不同的狀態(tài):
enum class RequestStatus { Pending, Success, Failed };
然后根據(jù)不同狀態(tài)做處理:
void handleRequest(RequestStatus status) { switch(status) { case RequestStatus::Pending: std::cout << "等待響應(yīng)..." << std::endl; break; case RequestStatus::Success: std::cout << "成功獲取數(shù)據(jù)" << std::endl; break; case RequestStatus::Failed: std::cout << "請求失敗" << std::endl; break; } }
3. 避免全局變量污染(使用 enum class)
普通枚舉的值會被“提升”到外層作用域,容易造成重名問題:
enum Color { RED, GREEN }; enum Fruit { RED, APPLE }; // 編譯錯誤:RED重復(fù)了
改用 enum class 就可以解決這個問題:
enum class Color { RED, GREEN }; enum class Fruit { RED, APPLE }; Color c = Color::RED; Fruit f = Fruit::RED;
定義和使用時需要注意什么?
- 不要混用不同枚舉類型的值:即使它們底層都是int,也不建議直接比較或賦值。
- 盡量使用 enum class:避免命名沖突,提高類型安全性。
- 顯式設(shè)置初始值可以增強可維護性:尤其是用于協(xié)議或配置時,明確數(shù)值有助于排查問題。
- 不能直接輸出枚舉名稱:C++沒有內(nèi)置方法將枚舉值轉(zhuǎn)為字符串,需要自己實現(xiàn)映射。
基本上就這些。enum 在 C++ 中雖然基礎(chǔ),但用好了能大大提升代碼的清晰度和安全性。