다음을 통해 공유


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은 열거 형식입니다.열거 형식은 정수 계열 형식 이므로 배열 첨자 연산자에 대 한 인수로 사용할 수 있습니다.(자세한 내용은 아래 첨자 연산자입니다.)

참고 항목

참조

C 열거형 선언

C + + 키워드

열거자 이름

열거자 상수 정의

변환 및 열거 형식