列挙型の定義:列挙型(enumeration)はC++における派生データ型の一種であり、ユーザーが定義する複数の列挙定数の集合である。

定義形式:列挙型の定義形式は次のとおりです。

enum <类型名> {<枚举常量表>};

形式の説明:

  • キーワードenum——その後の識別子が列挙型の名前であることを示す。
  • 列挙定数表——列挙定数で構成される。「列挙定数」または「列挙メンバー」は、識別子形式で表される整数型の値であり、列挙型の値を表す。列挙定数表は列挙型のすべての値を列挙し、各列挙定数の間は「,」で区切り、かつそれぞれ異なる値でなければならない。値の型は条件式と同じである。

適用例:

enum color_set1 {RED, BLUE, WHITE, BLACK}; // 定义枚举类型color_set1
enum week {Sun, Mon, Tue, Wed, Thu, Fri, Sat}; // 定义枚举类型week

重要なヒント:

列挙定数はその列挙型の変数が取り得る値を表し、コンパイルシステムは各列挙定数に整数値を割り当てる。デフォルトでは、この整数は列挙された要素の番号であり、番号は0から始まる。 列挙型を定義するときに、一部またはすべての列挙定数に整数値を指定できる。指定した値より前の列挙定数はデフォルトの方法で値を取り、指定した値より後の列挙定数は順に1ずつ加算する原則で値を取る。 各列挙定数の値は重複してもよい。例:

enum fruit_set {apple, orange, banana=1, peach, grape}
//枚举常量apple=0,orange=1, banana=1,peach=2,grape=3。
enum week {Sun=7, Mon=1, Tue, Wed, Thu, Fri, Sat};
//枚举常量Sun,Mon,Tue,Wed,Thu,Fri,Sat的值分别为7、1、2、3、4、5、6。

列挙定数は識別子形式でのみ表すことができ、整数型や文字型などのリテラル定数では表せない。例えば、次の定義は不正である:

enum letter_set {'a','d','F','s','T'}; //枚举常量不能是字符常量
enum year_set{2000,2001,2002,2003,2004,2005}; //枚举常量不能是整型常量

次の形式に変更すれば定義は合法となる:

enum letter_set {a, d, F, s, T};
enum year_set{y2000, y2001, y2002, y2003, y2004, y2005};

列挙変数の使用

列挙型を定義する主な目的は、プログラムの可読性を高めることである。列挙型の最も一般的で有意義な用途の一つは状態量を記述することであり、これについては第9章「入出力ストリームクラス」で確認できる。

定義形式:列挙型を定義した後、その列挙型の変数を定義できる。例:

color_set1 color1, color2;

型と変数を同時に定義することもできる(型名を省略することも可能)。形式は次のとおりです:

enum {Sun,Mon,Tue,Wed,Thu,Fri,Sat} weekday1, weekday2;

関連操作

列挙変数の値は、列挙定数表に列挙されている値のみを取ることができ、整数型の部分集合である。

列挙変数が占有するメモリのサイズは整数型と同じである。

列挙変数は代入、関係演算、および出力操作のみに参加でき、演算に参加するときはその整数値を使用する。例えば、次の定義があるとする:

enum color_set1 {RED, BLUE, WHITE, BLACK} color1, color2;
enum color_set2 { GREEN, RED, YELLOW, WHITE} color3, color4;

許可される代入操作は次のとおりです:

color3=RED;           //将枚举常量值赋给枚举变量
color4=color3;        //相同类型的枚举变量赋值,color4的值为RED
int  i=color3;        //将枚举变量赋给整型变量,i的值为1
int  j=GREEN;         //将枚举常量赋给整型变量,j的值为0

許可される関係演算には、==、<、>、<=、>=、!=などがある。例:

//比较同类型枚举变量color3,color4是否相等
if (color3==color4) cout<<"相等";
//输出的是变量color3与WHITE的比较结果,结果为1
cout<< color3<WHITE;

列挙変数は直接出力でき、出力されるのは変数の整数値である。例:

cout<< color3;         //输出的是color3的整数值,即RED的整数值1

例

ポケットの中に赤、黄、青、白、黒の5色のボールがいくつかある。毎回ポケットから異なる色のボールを3つ取り出し、すべての取り出し方を数えて出力する。

分析:ボールは5色のいずれかしかないため、列挙型でボールの色を表すことができる。取り出したボールをi、j、kとする。問題の条件により、i、j、kはそれぞれ5つの値を取ることができ、かつi≠j≠kである。総当たり法を用いて、考えられるすべての組み合わせを1つずつ検証し、条件を満たす組み合わせを見つけて出力する。

例

#include<iostream> #include<iomanip> using namespace std; int main(){ enum color_set {red,yellow,blue,white,black}; //列挙型colorを宣言 color_set color; int i,j,k,counter=0,loop; //counterは異なる色の組み合わせ数を累計する for(i=red;i<=black;i++) { for(j=red;j<=black;j++) { if(i!=j){ //最初の2つのボールの色が異なる for(k=red;k<=black;k++) if(k!=i&&k!=j){ //3つ目のボールが最初の2つと異なり、条件を満たす counter++; if((counter)%22==0){ //1画面に22行表示 cout<<"Enterキーを押して続行してください"; cin.get(); } cout<<setw(15)<<counter; /*以下に各取り出し方を出力する。1行が1つの取り出し方の3色である*/ for(loop=1;loop<=3;loop++){ switch(loop){ case 1: color=(color_set) i; break; //1つ目はi case 2: color=(color_set) j; break; //2つ目はj case 3: color=(color_set) k; break; //3つ目はk } switch(color){ case red: cout<<setw(15)<<"red"; break; case yellow:cout<<setw(15)<<"yellow";break; case blue: cout<<setw(15)<<"blue"; break; case white: cout<<setw(15)<<"white"; break; case black: cout<<setw(15)<<"black"; break; } } cout<<endl; //1つの取り出し方を出力したら改行 } } } } cout<<"合計:"<<counter<<"通りの取り出し方"<<endl; return 0; }

重要なヒント

  • 列挙変数は直接出力できるが、直接入力することはできない。例:cout >> color3; //不正
  • 列挙変数に定数を直接代入することはできない。例:color1=1; //不正
  • 異なる型の列挙変数は相互に代入できない。例:color1=color3; //不正
  • 列挙変数の入出力は通常、switch文を使用して文字または文字列に変換する。列挙型データのその他の処理もswitch文を用いることが多く、プログラムの合法性と可読性を保証する。