【C++】列挙タイプとその用法

2548 ワード

C++には多くの組み込みデータ型が含まれています.しかし、私たちがやりたいことにとって、これらのタイプは時には足りないことがあります.したがって,C++はプログラマが独自のデータ型を作成することを可能にする.これらのデータ型は、ユーザー定義データ型と呼ばれます.
最も簡単なユーザー定義データ型は、列挙タイプ(Enumerated Type)かもしれません.列挙タイプの各可能な値は、シンボル定数(列挙器と呼ばれる)として定義されます.
一、どうして列挙するのですか.
その文法を知る前に、列挙のどのような用途を見て、学ぶ必要がありますか?実は列挙はとても実用的なツールで、主にコードの読書の方面に体現しています.
このような場面を想定すると、1つの項目に千行以上、一定の定数タイプがあり、いくつかの固定的な値しか取れません.書くときに図の便利さのために、色、状態など、数字で表すことができます.これは便利で、メモリを節約しますが、1ヶ月後にこのコードを理解するのは容易ではありません.
さらに一歩下がって、色を例にとると、7、8色を使うこともありますが、数字で表すと、対応も極めて不便で、半日考えなければなりません.このとき、色が名前で表すと、メモリの中では数字で、ずっと気持ちがいいです.
二、文法
1定義
C++では、列挙タイプはenumキーで定義されます.たとえば、色タイプを定義します.
enum Color
{
    COLOR_BLACK,
    COLOR_RED,
    COLOR_BLUE,
    COLOR_GREEN,
    COLOR_WHITE,
    COLOR_CYAN,
    COLOR_YELLOW,
    COLOR_MAGENTA, 
};

カッコ内には、カンマで区切られたすべての可能な値(列挙器)があります.カッコの最後にはセミコロンが必要です.
注:列挙タイプが定義されると、列挙器はグローバル定数に相当するため、一般的な列挙器の名前には接頭辞と大文字が必要で、他の変数名と競合しないようにします.
2使用
Color c1(COLOR_WHITE);
Color c2 = COLOR_BLACK;
std::cout << c1 << endl;
std::cout << c2 << endl;

以上のコードは4と0を出力します.デフォルトでは、列挙器の値は0,1,2の順です.もちろん、各列挙器の値を明示的に定義することもできる
enum Animal
{
    ANIMAL_CAT = -3,
    ANIMAL_DOG, //      -2
    ANIMAL_PIG, //     -1
    ANIMAL_HORSE = 5,
    ANIMAL_GIRAFFE = 5, //  ANIMAL_HORSE      
    ANIMAL_CHICKEN //     6
};

1つの列挙器の値が与えられると、次の列挙器はデフォルトで1を加算します.同時に、2つの列挙器に同じ値を与えることもできます.この場合、この2つの列挙器は完全に同じで、交換することができます.名前だけが違います.
三、その他の用例
特定の事前定義された状態のセットを表す必要がある場合、列挙タイプはコードの可読性に非常に有用である.
たとえば、関数内部にエラーが発生した場合、関数は通常、エラーコードを表すために呼び出し元に整数を返します.通常、小さな負数は、異なる可能性のあるエラーコードを表すために使用されます.例:
int readFileContents()
{
    if (!openFile())
        return -1;
    if (!readFile())
        return -2;
    if (!parseFile())
        return -3;
 
    return 0; // success
}

しかし、このような数字を使うのはよく霧の中にある.1つの代替方法は、列挙タイプを使用することです.
enum ParseResult
{
    SUCCESS = 0,
    ERROR_OPENING_FILE = -1,
    ERROR_READING_FILE = -2,
    ERROR_PARSING_FILE = -3
};
 
ParseResult readFileContents()
{
    if (!openFile())
        return ERROR_OPENING_FILE;
    if (!readFile())
        return ERROR_READING_FILE;
    if (!parsefile())
        return ERROR_PARSING_FILE;
 
    return SUCCESS;
}

これは、整数戻り値を使用するよりも読みやすく、理解しやすいです.この関数を使用すると、より便利になります.
if (readFileContents() == SUCCESS)
{
    // do something
}
else
{
    // print error message
}

最後に、私たちがよく使うブールタイプは、実は列挙タイプの特例にすぎず、列挙タイプはブールタイプの用途をより大きく豊かにしています.