Tipo de enumeração em C++

Jinku Hu 12 outubro 2023
  1. Enumerações sem escopo em C++
  2. Enumerações com escopo em C++
Tipo de enumeração em C++

Este artigo demonstrará como usar o tipo de enumeração em C++.

Enumerações sem escopo em C++

As enumerações fazem parte da linguagem C há algum tempo. O C++ também implementou o mesmo conceito com alguns recursos adicionais. Geralmente, a enumeração é o mecanismo para nomear inteiros constantes. O programador define os nomes dos enumeradores. Os valores integrais podem ser especificados explicitamente ou inferidos pela posição do nome fornecido.

As enumerações são determinadas usando a palavra-chave enum e podem opcionalmente definir um nome para o tipo (por exemplo, Color no seguinte trecho de código). Observe que as constantes de enumeração C++ têm tipos integrais definidos pela implementação. Portanto, se os valores fornecidos precisam de espaço maior do que int, o tipo integral correspondente é escolhido como o tipo subjacente. O tipo também pode ser especificado explicitamente pelo usuário após o nome da enumeração e precisa ser separado por dois pontos (mostrado no quarto trecho de código neste artigo).

No exemplo a seguir, definimos uma enumeração chamada Color e especificamos os seis nomes de cores como constantes enumeradas. Como nenhuma dessas constantes tem o valor explícito atribuído a elas, os valores integrais são deduzidos com suas posições começando de zero. Este código implementa uma função de conversão de cor para string, que é limitada aos valores fornecidos. A variável Color também é uma enumeração sem escopo; isso significa que seus enumeradores (constantes) são acessíveis a partir do mesmo escopo da própria enumeração.

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

Resultado:

the given color is Red

Como alternativa, podemos definir uma enumeração (por exemplo, WeekDay) em que cada enumerador possui o valor integral atribuído explicitamente. Você pode utilizar este recurso para implementar uma estrutura flexível que pode ser modificada de acordo com diferentes convenções de data. Os valores explícitos e posicionais podem ser misturados no mesmo objeto de enumeração, se necessário.

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

Resultado:

today is 6th day

Enumerações com escopo em C++

Outro recurso útil das enumerações é ter um escopo; portanto, é chamado de enumerações com escopo. O último pode ser declarado usando palavras-chave enum class ou enum struct. As enumerações com escopo seguem as convenções usuais de escopo e não são acessíveis fora do escopo de enumeração. No lado positivo, as enumerações com escopo global não resultarão em conflitos de nomes como as enumerações sem escopo podem fazer.

O próximo exemplo de código define WeekDay do exemplo anterior como a enumeração com escopo. Observe que as enumerações sem escopo podem ser impressas usando a função cout como qualquer outra variável, mas aquela com escopo precisa ser convertida para o valor integral correspondente.

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

Resultado:

today is 6th day

As enumerações com escopo devem ter um nome, em contraste com aquelas sem escopo. Por outro lado, a enumeração com escopo não tem um tipo integral subjacente padrão. Esteja ciente de que a conversão de tipo subjacente pode resultar em estouros quando os enumeradores são convertidos em tipos diferentes.

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

Resultado:

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

Artigo relacionado - C++ Enum