C ++:61 ---列挙型(列挙型)特別なツールと技術

  • 私たちができるように、種類を列挙一緒に、一定の組織の整数に設定そして、クラス、各列挙型は新しい型を定義します。列挙リテラルはタイプに属します

まず、分類の列挙

  • C ++は、二つの列挙が含まれています。
    • スコープ(C ++ 11標準に組み込まれます)
    • スコープではありません

スコープ

  • スコープ一般的な形式は次のとおりです。
    • 最初はキーワード列挙型クラスである(または同等列挙型構造体を呼び出します)
    • 名前と括弧コンマの花で区切って列挙型列挙メンバーのリストが続きます
    • 最後にはセミコロンが含まれています
  • たとえば、列挙型の以下の定義は、列挙の3つのメンバーを含む、open_modesと呼ばれます:
enum class open_modes { input, output, append };

スコープではありません

  • スコープのない列挙型は、キーワードクラス(または構造体)を省略し、列挙型の名前は任意です
//命名的
enum color { red, yellow, green };
//未命名的
enum { floatPrec = 6, doublePrec = 10, double_doublePrec = 10 };
  • 列挙型に名前が付いていない場合、我々は唯一の列挙型のオブジェクトの定義でそれを定義することができます同様の定義とクラスは、我々は最後に右サイドブレースとセミコロンで定義された列挙型の間の宣言をカンマで区切ったリストを提供する必要があります

第二に、列挙型のメンバー

列挙子の範囲

  • 異なるスコープの列挙型メンバの二種類:
    • でスコープ列挙型:列挙型のメンバーの名前は、ガイドラインの正常な範囲を追跡し、外側は列挙型の役割ではアクセスできません
    • 列挙型は、範囲が限定されない:列挙スコープ自体と同じスコープの列挙メンバーを
  • ケースプレゼンテーション:
enum color { red, yellow, green };         //不限定作用域的枚举类型
//enum stoplight { red, yellow, green };   //错误,与color中的成员冲突
enum class peppers { red, yellow, green }; //正确,限定作用域的枚举成员只在花括号中有效

color eyes = green;  //正确,不限定作用域的枚举类型的枚举成员位于有效的作用域中
//peppers p = green; //错误,peppers的枚举成员不在有效作用域中,color::green在有效的作用域中,类型不一致

color hair = color::red;   //正确,允许显式地访问枚举成员
peppers p2 = peppers::red; //正确,使用peppers的red

列挙子の値

  • デフォルトでは、ゼロからの列挙値は、1だけインクリメントされ
  • 私たちは、明示的に初期値、提供していない場合はメンバープラス1の値の前に列挙列挙メンバーの現在の値を
  • 私たちは、例えば、列挙メンバーに特別な価値を任命することができます:
enum class intTypes {
    charTyp = 8, shortTyp = 16, intTyp = 16,
    longTyp = 32, long_longTyp = 64
};
  • 列挙メンバーを初期化するときに提供された初期値は定数式でなければならないので、列挙体は、CONSTありますつまり、列挙自体の各メンバーが一定の表現で、私たちは、列挙型のメンバーは、任意の場所で定数式が必要に使用することができます。例えば、我々は変数constexprの列挙型を定義することができます。
enum class intTypes {
    charTyp = 8, shortTyp = 16, intTyp = 16,
    longTyp = 32, long_longTyp = 64
};

int main()
{
    constexpr intTypes charbits = intTypes::charTyp;
    return 0;
}
  • 他の使用シナリオの列挙:
    • 私たちは、switch文の表現として列挙型が、caseラベルとして列挙値にすることができ
    • 我々はまた、非型テンプレートパラメータを使用したタイプを列挙します
    • 列挙型は、型定義で静的データメンバを初期化します

第三に、そしてクラスは、新しい列挙型を定義します

  • 列挙型の名前がある限り、私たちは定義し、この型のメンバを初期化することができます
  • したいオブジェクトを初期化またはオブジェクトの割り当てを列挙するENUM、あなたがしなければならない列挙型またはその型のオブジェクトの別のメンバーを使用します例えば:
enum class open_modes { input, output, append };

int main()
{
    //open_modes om = 2;    //错误,2不属于类型open_modes

    open_modes om;
    om = open_modes::input; //正确,input是open_modes的一个枚举成员
    return 0;
}
  • ないスコープオブジェクトまたは列挙型列挙メンバーは自動的に整数に変換しますしたがって、我々は、整数値を必要な場所にそれらを使用することができます例えば:
enum color { red, yellow, green };
enum class peppers { red, yellow, green };

int main()
{
    int i = color::red;   //正确,不限定作用域的枚举类型的枚举成员隐式地转换成int
    int j = peppers::red; //错误,限定作用域的枚举类型不会进行隐式转换
    return 0;
}

第四に、列挙型のサイズを指定

  • 各列挙は、ユニークなタイプを定義しているが、しかし実際には列挙型は、整数型で表され
  • C ++ 11標準では、我々はの列挙することができ、我々は列挙型の名前で使用するコロンと種類
  • 例えば:
enum intValues :unsigned long long
{
    charTyp = 255, shortTyp = 65535, intTyp = 65535,
    longTyp = 4294967285UL,
    long_longTyp = 18446744073709551615ULL
};
  • デフォルトでは:
    • スコープ列挙メンバーのタイプはintです
    • 列挙型は、限定された範囲ではないそのデフォルトタイプ列挙メンバーが存在しない場合、我々は唯一の潜在的なメンバーの種類を知って、十分な大きさで、確かに列挙値を収容することができます
  • 我々は列挙子電位の種類を指定した場合は、その後、(暗黙的に列挙型の範囲を制限する指定を含む)を超え列挙子の値いったんこのタイプの範囲を収容することができ、イニシエータプログラムエラー
  • コントロールの種類を指定する列挙型の潜在的な可能性には、私たちは環境の異なるタイプを実装することができ、我々はコンパイラ生成されたコードと一致する他の環境で生成されたコードによってプログラムの一の実装でその環境を確保することができます

第五に、事前に宣言の列挙型

  • C ++ 11標準では、我々は、事前に列挙型を宣言することができます列挙型の宣言フロント(暗黙的または明示的かどうか)は、そのメンバーのサイズを指定する必要があります。
  • 形式は次のとおりです。
    • スコープではない列挙型の場合である:それは指定されていない場合、デフォルトのサイズのメンバーであるため、各ステートメントがメンバーのサイズを指定する必要があります。
    • スコープの列挙型の場合である:そのメンバーのサイズを指定することはできません、この値は暗黙的にintとして定義され、 
  • 例えば:
enum intValues :unsigned long long; //前置声明,指定了成员类型
enum intValues //定义
{
    charTyp = 255, shortTyp = 65535, intTyp = 65535,
    longTyp = 4294967285UL,
    long_longTyp = 18446744073709551615ULL
};

enum class open_modes; //前置声明,使用默认成员类型int
enum class open_modes { input, output, append }; //定义
  • フロント声明いくつかの注意事項:
    • 他の宣言と文、などの列挙型宣言と一致している必要があります定義、列挙型のすべてのことを意味メンバーのサイズは一貫宣言と定義でなければなりません
    • また、我々はできません同じコンテキストにスコープの列挙名を宣言していないし、同じ名前の列挙型宣言をスコープ
    • ここではいくつかのプレゼンテーションケースがあります
enum class intValues;
enum intValues;       //错误,intValues已经被声明限定作用域的enum
enum intVales :long;  //错误,intValues已经被声明为int

六、パラメータが列挙と一致します

  • 列挙型のオブジェクトを初期化するには、あなたが列挙またはそのメンバーの列挙型の別のオブジェクトを使用する必要があります。
  • したがって、整数値が値列挙部材に正確に等しい場合であっても、それを使用列挙関数の引数として使用することができません
enum Tokens { INLINE = 128, VIRTUAL = 129 };

void ff(Tokens)
{
    std::cout << "Tokens" << std::endl;
}
void ff(int)
{
    std::cout << "int" << std::endl;
}

int main()
{
    Tokens curTok = INLINE;
    ff(128);
    ff(INLINE);
    ff(curTok);

    return 0;
}

  • ながら、我々は直接列挙の整数値は、パラメータに渡すことができないかもしれないが、パラメータ整数渡されたオブジェクトまたは列挙メンバースコープの列挙型に限定されるものではないことこのとき、列挙整数INTの値以上を増強するために、結果は、タイプ列挙型の電位の実際のリフト量によって決定されます。
enum Tokens { INLINE = 128, VIRTUAL = 129 };

void newf(unsigned char)
{
    std::cout << "unsigned char" << std::endl;
}
void newf(int)
{
    std::cout << "int" << std::endl;
}
int main()
{
    unsigned char uc = VIRTUAL;
    newf(VIRTUAL);
    newf(uc);

    return 0;
}

  • 列挙型列挙Tokends 2つだけのメンバーは、より大きな値は129です。列挙型は、多くのコンパイラがトークンの潜在的な種類としてはunsigned charを使用し、unsigned char型で表すことができます。トークン電位の種類に関係なく、その目的と列挙メンバーがintに昇格されています。具体的には、列挙メンバーは、列挙値を保存することができても、unsigned char型にすぎunsigned char型に登ることはありません
リリース1504元の記事 ウォンの賞賛1063 ビュー43万+

おすすめ

転載: blog.csdn.net/qq_41453285/article/details/104704584
おすすめ