Type d'énumération en C++

Jinku Hu 12 octobre 2023
  1. Énumérations sans portée en C++
  2. Énumérations de portée en C++
Type d'énumération en C++

Cet article montrera comment utiliser le type énumération en C++.

Énumérations sans portée en C++

Les énumérations font partie du langage C depuis un certain temps. Le C++ a également implémenté le même concept avec quelques fonctionnalités supplémentaires. Généralement, l’énumération est le mécanisme pour nommer des entiers constants. Le programmeur définit les noms des énumérateurs. Les valeurs intégrales peuvent être spécifiées explicitement ou déduites par la position du nom donné.

Les énumérations sont déterminées à l’aide du mot-clé enum et elles peuvent éventuellement définir un nom pour le type (par exemple Color dans l’extrait de code suivant). Notez que les constantes d’énumération C++ ont des types intégraux définis par l’implémentation. Ainsi, si les valeurs données nécessitent un espace plus grand que le int, le type intégral correspondant est choisi comme type sous-jacent. Le type peut également être explicitement spécifié par l’utilisateur après le nom de l’énumération et doit être séparé par un seul deux-points (indiqué dans le quatrième extrait de code de cet article).

Dans l’exemple suivant, nous définissons une énumération nommée Color et spécifions les six noms de couleurs comme constantes énumérées. Comme aucune de ces constantes n’a la valeur explicite qui leur est attribuée, les valeurs intégrales sont déduites avec leurs positions à partir de zéro. Ce code implémente une fonction de conversion de couleur en chaîne, qui est limitée aux valeurs données. La variable Color est également une énumération sans portée ; cela signifie que ses énumérateurs (constantes) sont accessibles à partir de la même portée que l’énumération elle-même.

#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;
}

Production:

the given color is Red

Alternativement, nous pouvons définir une énumération (par exemple WeekDay) où chaque énumérateur a la valeur intégrale explicitement attribuée. Vous pouvez utiliser cette fonctionnalité pour implémenter une structure flexible qui peut être modifiée selon différentes conventions de date. Les valeurs explicites et positionnelles peuvent être mélangées dans le même objet d’énumération si nécessaire.

#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;
}

Production:

today is 6th day

Énumérations de portée en C++

Une autre caractéristique utile des énumérations est d’avoir une portée ; ainsi, cela s’appelle des énumérations étendues. Ce dernier peut être déclaré à l’aide des mots-clés enum class ou enum struct. Les énumérations de portée suivent les conventions habituelles de portée et ne sont pas accessibles en dehors de la portée d’énumération. Du côté positif, les énumérations de portée globale n’entraîneront pas de collisions de noms comme pourraient le faire les énumérations sans portée.

L’exemple de code suivant définit WeekDay de l’exemple précédent en tant qu’énumération étendue. Notez que les énumérations sans portée peuvent être imprimées en utilisant la fonction cout comme n’importe quelle autre variable, mais celle avec portée doit être convertie en la valeur intégrale correspondante.

#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;
}

Production:

today is 6th day

Les énumérations étendues doivent avoir un nom, contrairement aux énumérations non étendues. D’un autre côté, l’énumération étendue n’a pas de type intégral sous-jacent par défaut. Sachez que la conversion de type sous-jacente peut entraîner des débordements lorsque les énumérateurs sont convertis en différents types.

#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;
}

Production:

today is 4294967295th day
Auteur: 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

Article connexe - C++ Enum