Объявления перечисления 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(перечислимый тип.Так как перечислимые типы целочисленные типы, их можно использовать в качестве аргументов оператора индекса массива.(Дополнительные сведения см. в разделе Оператор индекса.)