簡體   English   中英

在C和C ++中使用枚舉有什么用處

[英]What is the use of enums in C and C++

枚舉是常量整數值的列表。 它可以用來代替使用#define定義常量值。 但除此之外,我還沒有發現C和CPP中枚舉的任何實質性用途。 任何人都可以讓我知道枚舉的確切用途。

最初我想如果我們創建一個枚舉變量並分配一個不在枚舉值中的值,編譯器就會喊出來。 但事實並非如此。 我們可以為枚舉變量賦值。 我想不出枚舉的任何實質性用途。

枚舉在編程中非常有用,因為它們使代碼更具可讀性和更一致性。

例如:說我們有以下switch語句:

switch(fruit)
{
    case 1:
        // code goes here
        break;
    case 2:
        // code goes here
        break;
    case 3:
        // code goes here
        break;
    default:
        // code goes here
        break;
}

如果你定義了一個包含你所擁有的水果的枚舉水果,然后按照以下方式使用它,那就更清楚了:

switch(fruit)
{
    case fruits::apple:
        // code goes here
        break;
    case fruits::orange:
        // code goes here
        break;
    case fruits::banana:
        // code goes here
        break;
    default:
        // code goes here
        break;
}

fruits是一個枚舉。

enum fruits { apple, orange, banana };

現在將第一個片段與第二個片段進行比較。 第二個是更具可讀性,除此之外你不必記住1是蘋果,2是香蕉等等。

優於宏的優點

  • 調試器可以打印值的名稱
  • 你的常量將是作用域的(如果你願意,你也可以將它們放在C ++的命名空間中)
  • 如果您忘記了交換機中的枚舉常量,編譯器可以發出警告
  • 如果未提供顯式值,則會自動分配常量的值
  • 枚舉類型總是足以容納所有常量。 使用#define ,必須提交int或某些typedef並確保所有常量都適合手動

枚舉非常有助於使您的代碼易於閱讀和理解。

更多的瑣事突出我的觀點:

我讀過CleanCode vom Robert C. Martins這本書,並嘗試遵循他的一些建議,例如,代碼應該解釋自己。 枚舉在C / C ++(對於大多數常見的編譯器)中沒那么有用,因為它們表示為INT,您可以使用Enum中定義的其他值。 因此,#define或const變量具有可比性。 但是,其他語言允許您將有效值限制為Enum中定義的值。

所以,閱讀和寫作,讓我們說工作日對於枚舉來說更方便。 如果星期一是0或1或任何其他值,則無需記住。 如果其他人需要了解您的代碼,這一點就更為重要。

dayOfweek = MondaydayOfWeek = 0更容易理解

枚舉與#define沒什么不同,除了別人已經說過的,對我來說主要區別在於:

您可以將常量組合在一起

此外,枚舉有一個基礎類型,可以根據您的需要進行指定。 在C ++ 11中,您可以使用enum class來獲得強大的類型和范圍的枚舉,這使得枚舉更加有用。

一般來說,盡量避免使用預處理器,因為它對代碼及其嘗試的內容一無所知。 不要使用單個常量的定義,而是考慮編寫:

const int MY_CONSTANT = 42;

(以及定義類型常量的所有靜態,成員或命名空間變體)

編譯器不會大喊,因為枚舉被設計為對枚舉整數和整數位字段提供強類型支持(強大的......“一些打字支持” - C ++ 11為真正強類型的枚舉引入了枚舉類 )。

例如,請參閱我之前提出的問題的答案 ,並考慮使用#define在C語言中編寫相同內容時應采用的典型方法的區別。

在編寫您(或可能是其他開發人員)將要重用的類時,您可以使用枚舉,該枚舉可以表示易於閱讀的所述類的選項。 例如

class BankAccount {
      // Constructor
      BankAccount(int accountType) {
          switch(accountType) {
                case AccountType::SHARED:
                    // ...


enum AccountType {
      SHARED, SINGLE, // Etc...

所以它看起來像這樣:

 new BankAccount(AccountType::SHARED);

而不是這個:

 new BankAccount(0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM