Vídeo: ENTRE A GENTE TNH1 | ADRIANA ARRUDA | PARTE 1 2024
A programação é tudo sobre legibilidade. É difícil (na verdade é impossível) escrever e manter um programa que você não pode ler. Parte da leitura de uma listagem de código-fonte é entender o que representam os números usados no programa. A ajuda mais básica que o C ++ fornece é o #define onipresente, como no seguinte exemplo citado:
#define PI 3. 141592653589793
Esta solução está correta para os valores individuais, apesar de sofrer o fato de que o #define mecanismo não é (estritamente falando) uma parte de C / C ++ uma vez que o pré-processador é executado antes do compilador. Em resposta a isso, o C ++ 2011 apresentou uma expressão constante construção:
constexpr long double PI = 3. 141592653589793;
A palavra-chave constexpr traz constantes na barraca de C ++. Este PI tem um tipo real, como outras variáveis C ++. C ++ pode gerar mensagens de erro com PI que têm muito mais sentido do que as que envolvem 3. 14159.
As expressões constantes são boas para valores constantes individuais, mas muitas vezes as constantes representam conjuntos de coisas ao invés de constantes naturais, como no exemplo a seguir:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … e assim por diante …
Presumivelmente, essas constantes estão sendo usadas para identificar os estados, talvez sendo usados como um índice em uma matriz de objetos de estado ou como um valor em um banco de dados em algum lugar.
C ++ tem há muito tempo um mecanismo melhorado para definir esses tipos de constantes - a enumeração:
enum STATE {DC_OR_TERRITORY, // obtém 0 ALABAMA, // obtém 1 ALASKA, // obtém 2 ARKANSAS, // … e em breve…};
A palavra-chave enum apresenta uma seqüência de constantes chamada "enumeração". Nesse caso, a enumeração contém o nome STATE. Cada elemento desta enumeração recebe um valor começando em 0 e aumentando sequencialmente em 1, então DC_OR_TERRITORY é definido como 0, ALABAMA é definido como 1 e assim por diante. Você pode substituir esta sequenciação incremental usando uma declaração de atribuição da seguinte maneira:
enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … e assim por diante …};
Esta versão do STATE define um elemento DC, que recebe o valor 0. Em seguida, define um novo elemento TERRITORIO, que também é atribuído ao valor 0. ALABAMA pega 1, assim como antes.
Na prática, o programador pode usar enumerações para escrever código bastante legível como o seguinte:
double taxRate (STATE s) {return taxRatesByState [s];}
O único problema com essa abordagem é que essa enumeração não cria um novo tipo (como você pode pensar).Na verdade, de acordo com o padrão, STATE é apenas outro nome para int - e as constantes ALABAMA, ALASKA, e assim por diante são todos de tipo const int.
O compilador gcc realmente fornece um enum declarado dessa maneira um pouco mais de autoridade do que simplesmente chamá-lo de outra forma de int. Você pode realmente sobrecarregar funções com base em um tipo de enum:
void fn (STATE s); vazio fn (int n); fn (ALASKA); // invoca fn (STATE)
O padrão 2011 permite que o programador crie um tipo completamente novo usando a palavra-chave enum. Como os criadores do novo padrão não queriam quebrar o código existente, o padrão requer a adição de uma palavra-chave adicional para definir um tipo de enumeração, como no exemplo a seguir:
enum class ESTATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … e assim por diante …};
Uma classe de enumeração agora é um tipo de escala completa como qualquer outra classe definida pelo usuário. O seguinte não é legal ainda por dois motivos:
int s = ALASKA;
Primeiro, a constante ALASKA é definida apenas no espaço para nome STATE. Assim, o nome da constante é ESTADO:: ALASKA. Em segundo lugar, o tipo não é int, mas STATE. Você não pode atribuir um valor do tipo STATE a um int.
ESTADO s = ESTADO:: ALASKA;
O programador pode reformular um ESTADO em um int, mas deve fazê-lo explicitamente. As conversões simples não o cortam com classes de enumeração:
int n = (int) ESTADO:: ALASKA;
Este novo tipo de enum também pode ser baseado em um dos outros tipos de número de contagem, além de apenas int:
enum class ESTATE: char {DC, // … o restante da declaração é o mesmo