2014-03-25 42 views
5

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

起初我想如果我們創建了一個枚舉變量,並分配一個值,它是不是在枚舉值,編譯器會喊。但事實並非如此。我們可以將任何值賦給枚舉變量。我想不出任何實質性的枚舉。

+1

因爲'#define'應避免和'在C++ 11枚舉class'是強鍵入 –

+2

http://www.cprogramming.com/c++11/c++11-nullptr-strongly-typed-enum-class.html –

回答

8

優勢在宏

  • 調試器可以打印值名稱
  • 您的常量將作用域(如果你願意,你可以把它們也命名空間在C++)
  • 編譯器可以警告如果你忘記了一個開關中的枚舉常量
  • 如果你沒有給出明確的值,常量的值會被自動分配
  • 枚舉類型總是足夠大以容納所有的缺點tants。當使用#define,你必須承諾int或某些類型定義,並確保所有的常量適合手動
10

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

例如:說我們有以下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是香蕉等等。

+2

在這個許多小的階段你的答案增量開發是...危險的。建議您暫時刪除,刪除時編輯,然後在準備好時取消刪除答案。它保留你原來的回答時間。 –

+0

感謝您的建議。我會按照你的方式留待以後的帖子。 – Christos

2

枚舉是有益的極端,使您的代碼易於閱讀和理解。

一些瑣事更突顯我的觀點:

我讀的書CleanCode VOM羅伯特·馬丁斯,並嘗試跟隨他的一些建議,例如,代碼應該解釋本身。枚舉在C/C++(最常見的編譯器)中沒有那麼有用,因爲它們表示爲INT,您可以使用其他值作爲Enum中定義的值。所以,#define或const變量相當有用。但是,其他語言允許您將有效值限制爲Enum內定義的值。

所以,讀,寫,比方說,一個工作日是更方便使用枚舉。如果週一是0或1或任何其他值,則無需記住。如果其他人需要了解您的代碼,這一點更爲重要。

dayOfweek = Monday是更容易理解比dayOfWeek = 0

+1

雖然這是真的,但這個答案感覺就像缺少了一些東西。你能詳細說明一下嗎? – BradleyDotNET

2

枚舉不是來自#define太大區別,除了別人已經說過,我的主要區別是:

您可以將常量組合在一起

此外,枚舉有一個基本類型,可以指定您的需要。在C++ 11中,你可以使用enum class來獲得一個強類型和範圍的枚舉,這使得枚舉更加有用。

一般來說,儘量避免使用預處理器,因爲它對代碼以及它想要做什麼都沒有任何想法。相反,使用單個常數的定義,考慮寫:

const int MY_CONSTANT = 42; 

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

1

編譯器不會喊,因爲枚舉已經被設計給枚舉的整數和整數位字段提供強大的打字支持(很好......「一些打字支持」 - C++ 11爲真正的強類型枚舉引入enum classes)。

例如參見this answer我給出了一個前面的問題,並考慮到與使用#define在C中編寫相同材料時應採用的典型方法的區別。

1

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

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


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

因此,這將是這樣的:

new BankAccount(AccountType::SHARED); 

,而不是這樣的:

new BankAccount(0);