Aufzählungstyp in C++

Jinku Hu 12 Oktober 2023
  1. Aufzählungen ohne Gültigkeitsbereich in C++
  2. Bereichsbezogene Aufzählungen in C++
Aufzählungstyp in C++

In diesem Artikel wird veranschaulicht, wie der Aufzählungstyp in C++ verwendet wird.

Aufzählungen ohne Gültigkeitsbereich in C++

Aufzählungen sind seit einiger Zeit ein Teil der C-Sprache. Auch C++ implementierte das gleiche Konzept mit einigen zusätzlichen Funktionen. Im Allgemeinen ist Aufzählung der Mechanismus, um konstante ganze Zahlen zu benennen. Der Programmierer definiert Enumeratornamen. Ganzzahlige Werte können explizit angegeben oder aus der Position des gegebenen Namens abgeleitet werden.

Aufzählungen werden über das Schlüsselwort enum bestimmt und können optional einen Namen für den Typ definieren (z. B. Color im folgenden Code-Schnipsel). Beachten Sie, dass die C++-Enumerationskonstanten implementierungsdefinierte ganzzahlige Typen haben. Benötigen die angegebenen Werte also mehr Platz als das int, wird der entsprechende ganzzahlige Typ als zugrunde liegender Typ gewählt. Der Typ kann vom Benutzer auch explizit nach dem Aufzählungsnamen angegeben werden und muss durch einen einzelnen Doppelpunkt getrennt werden (gezeigt im vierten Code-Snippet in diesem Artikel).

Im folgenden Beispiel definieren wir eine Aufzählung namens Color und geben die sechs Farbnamen als Aufzählungskonstanten an. Da keiner dieser Konstanten der explizite Wert zugewiesen ist, werden die Integralwerte mit ihrer Position beginnend bei Null abgeleitet. Dieser Code implementiert eine Funktion zur Konvertierung von Farbe in Zeichenkette, die auf die angegebenen Werte beschränkt ist. Die Variable Color ist ebenfalls eine Aufzählung ohne Bereich; Dies bedeutet, dass auf ihre Enumeratoren (Konstanten) aus demselben Bereich wie auf die Enumeration selbst zugegriffen werden kann.

#include <iostream>

using std::cout;
using std::endl;
using std::string;

enum Color { RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW };

string ColorToString(Color c) {
  switch (c) {
    case RED:
      return "Red";
    case BLUE:
      return "Blue";
    case GREEN:
      return "Green";
    case CYAN:
      return "Cyan";
    case MAGENTA:
      return "Magenta";
    case YELLOW:
      return "Yellow";
    default:
      return "NAN";
  }
}

int main() {
  Color col1 = RED;

  cout << "the given color is " << ColorToString(col1) << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

the given color is Red

Alternativ können wir eine Enumeration (z. B. WeekDay) definieren, bei der jeder Enumerator den explizit zugewiesenen ganzzahligen Wert hat. Sie können diese Funktion nutzen, um eine flexible Struktur zu implementieren, die gemäß unterschiedlichen Datumskonventionen geändert werden kann. Explizite und Positionswerte können bei Bedarf im selben Aufzählungsobjekt gemischt werden.

#include <iostream>

using std::cout;
using std::endl;

enum WeekDay { MON = 1, TUE = 2, WED = 3, THU = 4, FRI = 5, SAT = 6, SUN = 7 };

int main() {
  auto today = SAT;
  cout << "today is " << today << "th day" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

today is 6th day

Bereichsbezogene Aufzählungen in C++

Ein weiteres hilfreiches Feature von Aufzählungen ist der Bereich; daher wird es als bereichsbezogene Enumerationen bezeichnet. Letzteres kann mit den Schlüsselwörtern enum class oder enum struct deklariert werden. Aufzählungen mit Gültigkeitsbereich folgen den üblichen Konventionen des Bereichs und sind außerhalb des Aufzählungsbereichs nicht zugänglich. Auf der positiven Seite führen Aufzählungen mit globalem Gültigkeitsbereich nicht zu Namenskollisionen, wie dies bei Aufzählungen ohne Gültigkeitsbereich der Fall sein könnte.

Das nächste Codebeispiel definiert WeekDay aus dem vorherigen Beispiel als bereichsbezogene Enumeration. Beachten Sie, dass die Aufzählungen ohne Bereichsgrenzen mit der Funktion cout wie jede andere Variable gedruckt werden können, aber die bereichsbezogene Aufzählung muss in den entsprechenden ganzzahligen Wert umgewandelt werden.

#include <iostream>

using std::cout;
using std::endl;

enum class WeekDay {
  MON = -1,
  TUE = 2,
  WED = 3,
  THU = 4,
  FRI = 5,
  SAT = 6,
  SUN = 7
};

int main() {
  auto today = WeekDay::MON;
  cout << "today is " << static_cast<unsigned>(today) << "th day" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

today is 6th day

Enumerationen mit Gültigkeitsbereich müssen einen Namen haben, im Gegensatz zu Enumerationen ohne Gültigkeitsbereich. Auf der anderen Seite hat die bereichsbezogene Enumeration keinen zugrunde liegenden ganzzahligen Standardtyp. Beachten Sie, dass die zugrunde liegende Typkonvertierung zu Überläufen führen kann, wenn die Enumeratoren in andere Typen umgewandelt werden.

#include <iostream>

using std::cout;
using std::endl;

enum class WeekDay : int {
  MON = -1,
  TUE = 2,
  WED = 3,
  THU = 4,
  FRI = 5,
  SAT = 6,
  SUN = 7
};

int main() {
  auto today = WeekDay::MON;
  cout << "today is " << static_cast<unsigned>(today) << "th day" << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

today is 4294967295th day
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Enum