C + + 열거형 선언
열거형에는 열거자가 이라고 하는 명명 된 상수 집합으로 구성 되는 사용자 정의 형식입니다.
CLR 열거형에 대 한 자세한 내용은 클래스 열거.
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
열거형의 이름을 지정 하는 선언 자 목록입니다.자세한 내용은 선언 자 개요를 참조하십시오.
설명
열거형 값의 범위를 설명 하는 컨텍스트를 제공 합니다.다음 예제에서는 네 개의 짝패 줄의 카드에 포함 된 열거형을 보여 줍니다.
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;
이 할당에 오류가 컴파일 타임에 컴파일러 플래그 지정 합니다.기술적으로 두 변수가 정수 숫자 이지만, 캐스트 변환 하려면 필요는 int 열거형입니다.그러나 다른 방법으로 이동 하 고 승격 된 열거자를 정수 값으로 캐스팅 하지 않고 있습니다.
myAccountNumber = hearts;
type내부 형식이 있는 식별자.이 서명 되거나 서명 되지 않은 버전의 같은 모든 스칼라 형식이 될 수 있습니다 int, short, 또는 long.bool또는 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 상수를 나타나는 모든 선언을 사용할 수 있습니다.일반적으로 첫 번째 식별자의 값은 0입니다 (Diamonds, 앞의 예제에서), 및 이어지는 각 식별자에 대 한 값을 높입니다.따라서 값을 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은 열거 형식입니다.열거 형식은 정수 계열 형식 이므로 배열 첨자 연산자에 대 한 인수로 사용할 수 있습니다.(자세한 내용은 아래 첨자 연산자입니다.)