Поделиться через


Объявления перечисления C++

Перечисление пользовательский тип, состоящий из набора именованных констант, называемых перечислителями.

Дополнительные сведения о перечисления среды CLR см. в разделе класс enum.

enum [tag] [: type] {enum-list} [declarator];   // for definition of enumerated type
enum tag declarator;   // for declaration of variable of type tag

Параметры

  • tag
    Имя типа, заданного в перечисление.

  • type
    Базовый тип перечисления идентификаторов.См. примечания.

  • enum-list
    Список перечислителей, который содержит перечисление.

  • declarator
    Списке декларатора, который определяет имена перечислений.Дополнительные сведения см. в разделе Общие сведения о деклараторов.

Заметки

Перечисление предоставляет контекст для описания диапазон значений.В следующем примере демонстрируется перечисление, которое содержит 4 костюма в пакете перфокарт.

enum Suit { Diamonds, Hearts, Clubs, Spades };

Каждому имени перечисления выходит перечислителем и присвоить значение, соответствующее ее расположение в порядке значений в перечислении.Присвоен присвоено по умолчанию первое значение 0, следующее одно 1 и т дМожно установить значение перечислителя.

enum Suit { Diamonds = 1,
             Hearts, 
             Clubs,
             Spades };

перечислитель Diamonds присвоить значение 1.Это влияет на значения, присвоенные последующим перечислителям; Hearts будет присвоено значение 2, Clubs 3 и т д

В c# enum необходимо объявить ключевое слово перечисление.В C++ enum ключевое слово можно опустить.Примеры.

Suit current;          // Legal in C++ only

Переменная, основанной на перечислении могут быть присвоены определенные значения.

Suit currentSuit = Hearts;

При попытке присвоить hand значение, которое не является день недели

int  myAccountNumber = 012345678;
Suit hand;

hand = myAccountNumber;

компилятор пометит это назначение как ошибка во время компиляции.Хотя технически обе переменные числа целым числом, необходимые для преобразования cast int к перечислению.Однако можно переходить в другой способ и повысить уровень перечислитель к значению целого числа без приведения.

myAccountNumber = hearts;

type базовый тип идентификаторы.Это может быть любой скалярным типом, как подписанных и неподписанных версии int" shortили long.bool OR char также позволяет.

Перечислимые типы являются важными, если объект может выполнить известный и разумно ограниченный набор значений.Рассмотрим пример костюмов из пакета перфокарт:

// enumeration_declarations.cpp
// compile with: /c
class Card {
public:
   enum Suit {
      Diamonds,
      Hearts,
      Clubs,
      Spades
   };

   // Declare two constructors: a default constructor,
   //  and a constructor that sets the cardinal and
   //  suit value of the new card.
   Card();
   Card( int CardInit, Suit SuitInit );

   // Get and Set functions.
   int   GetCardinal();          // Get cardinal value of card.
   int   SetCardinal();          // Set cardinal value of card.
   Suit  GetSuit();              // Get suit of card.
   void  SetSuit(Suit new_suit); // Set suit of card.
   char *NameOf();               // Get string representation of card.

private:
   Suit  suit;
   int   cardinalValue;
};

// Define a postfix increment operator for Suit.
inline Card::Suit operator++( Card::Suit &rs, int ) {
   Card::Suit oldSuit = rs;
   rs = (Card::Suit)(rs + 1);
   return oldSuit;
}

В предыдущем примере определяется класс Card, содержащего вложенные перечислимый тип, Suit.

Поскольку тип Suit имя класса (гнездитCard), использоваться явно в открытых ссылкам.В методах, имя класса можно опустить.

Оператор инкремента, постфиксная Card::Suit определяет, поскольку без определяемого пользователем оператора инкремента, curSuit не удается увеличивается.Дополнительные сведения об определяемых пользователем операторах см. в разделе Перегрузка операторов.

Следующий Код создает пакет.

Card *Deck[52];
int   j = 0;

for( Card::Suit curSuit = Card::Diamonds ; curSuit <= Card::Spades ; curSuit++ )
   for( int i = 1; i <= 13; ++i )
      Deck[j++] = new Card( i, curSuit );

Рассмотрим следующий пример, касающиеся NameOf метод.

#define SIZE_OF_CARD_NAMES 20
char* Card::NameOf() {   // Get the name of a card.
   static char szName[SIZE_OF_CARD_NAMES];
   static char *Numbers[] = { 
      "1", "2", "3", "4", "5", "6", "7", "8", "9",
      "10", "Jack", "Queen", "King"
   };
   static char *Suits[] = {
      "Diamonds", "Hearts", "Clubs", "Spades" 
   };

   if( GetCardinal() < 13)
      strcpy_s( szName, SIZE_OF_CARD_NAMES, Numbers[GetCardinal()] );

   strcat_s( szName, SIZE_OF_CARD_NAMES, " of " );

   switch( GetSuit() ) {
      // Diamonds, Hearts, Clubs, and Spades do not need explicit
      //  class qualifier.
      case Diamonds:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Diamonds" );
      break;
      case Hearts:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Hearts" );
      break;
      case Clubs:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Clubs" );
      break;
      case Spades:
         strcat_s( szName, SIZE_OF_CARD_NAMES , "Spades" );
      break;
   }
   return szName;
}

Перечислимый тип целочисленный тип.Идентификаторы, вставленные с enum объявление можно использовать везде, где константы появляются.Обычно значение первого идентификатора (0Diamondsв предыдущем примере) и значениях увеличьте одному для каждого преуспевая идентификатора.Поэтому значение Spades 3.

Перечислителям не обязательно должны иметь уникальные значения в перечислении.Имя каждого перечислителя рассматриваться как константа, и должно быть уникальным в той области, где enum указывает.

Любой перечислитель в списке, включая первое, могут быть инициализированы значение, отличное от значения по умолчанию.Предположим объявление Suit было следующее:

enum Suit {
   Diamonds = 5,
   Hearts,
   Clubs = 4,
   Spades
};

после этого значения Diamonds" Hearts" Clubsи Spades были бы 5, 6, 4 и 5 соответственно.Обратите внимание, что 5 используется несколько раз.

значения по умолчанию для этих перечислителей упрощают реализацию NameOf функция:

#define SIZE_OF_CARD_NAMES 20
char* Card::NameOf() {   // Get the name of a card. 
   static char szName[SIZE_OF_CARD_NAMES];
   static char *Numbers[] = {
      "1", "2", "3", "4", "5", "6", "7", "8", "9",
      "10", "Jack", "Queen", "King"
   };
   static char *Suits[] = {
      "Diamonds", "Hearts", "Clubs", "Spades"
   };

   if( GetCardinal() < 13)
      strcpy_s( szName, SIZE_OF_CARD_NAMES, Numbers[GetCardinal()] );

   strcat_s( szName, SIZE_OF_CARD_NAMES, " of " );
   strcat_s( szName, SIZE_OF_CARD_NAMES, Suits[GetSuit()] );
   return szName;
}

Функции метода доступа GetSuit возвращает тип Suit(перечислимый тип.Так как перечислимые типы целочисленные типы, их можно использовать в качестве аргументов оператора индекса массива.(Дополнительные сведения см. в разделе Оператор индекса.)

См. также

Ссылки

Объявления перечисления C#

Ключевые слова C++

Имена перечислителя

Определение констант перечислителя

Преобразования и перечислимые типы