Inflexible de tipos enumeraciones en c ++

La programación es todo acerca de la legibilidad. Es difícil (en realidad es imposible) para escribir y mantener un programa que no se puede leer. Parte de la lectura de un listado de código fuente es la comprensión de lo que los números utilizados en el programa representan. La ayuda más básica que ofrece C ++ es el ubicuo #definir, como en el siguiente ejemplo citado con frecuencia:

PI #define 3.141592653589793

Esta solución está bien que los valores individuales, a pesar de que adolece del hecho de que la #definir mecanismo no es (en sentido estricto) una parte de C / C ++ desde el preprocesador se ejecuta antes de que el compilador. En respuesta a eso, C ++ 2011 introdujo una expresión constante construir:

constexpr largo doble PI = 3.141592653589793-

los contrastexpr palabra clave trae constantes en la tienda de C ++. Esta Pi tiene un tipo real, como variables de otro C ++. C ++ puede generar mensajes de error con Pi que hacen mucho más sentido que las que implican 3,14159.

Las expresiones constantes están muy bien para valores constantes individuales, pero a menudo constantes representan conjuntos de cosas en lugar de constantes naturales, como en el siguiente ejemplo:

#define DC_OR_TERRITORY 0 # definen Alabama 1 # 2 # definen ALASKA definen Arkansas 3 // ... y así sucesivamente ...

Es de suponer que estas constantes se utilizan para identificar los estados, tal vez de ser utilizado como un índice en una serie de objetos de estado o como un valor en una base de datos en alguna parte.

C ++ ha tenido durante mucho tiempo un mecanismo mejorado para la definición de estos tipos de constantes - la enumeración:

enumeración ESTADO {// DC_OR_TERRITORY, se 0ALABAMA, // obtiene 1ALASKA, // obtiene 2ARKANSAS, // ... y así sucesivamente ...} -

los enumeración palabra clave introduce una secuencia de constantes llama una “enumeración”. En este caso, la enumeración lleva el nombre ESTADO. Cada elemento de esta enumeración se asigna un valor a partir de 0 y aumentando secuencialmente por 1, por lo DC_OR_TERRITORY se define como 0, ALABAMA se define como 1, y así sucesivamente. Puede anular esta secuencia gradual mediante el uso de una sentencia de asignación de la siguiente manera:

ESTADO enum {DC, TERRITORIO = 0, Alabama, Alaska, // ... y así sucesivamente ...} -

Esta versión de ESTADO define un elemento corriente continua, que se da el valor 0. Se define entonces un nuevo elemento TERRITORIO, que también se le asigna el valor 0. ALABAMA recoge con 1, al igual que antes.

En la práctica, el programador puede utilizar enumeraciones escribir código muy legible como la siguiente:

TaxRate doble (s ESTADO) {return taxRatesByState [s] -}

El único problema con este enfoque es que esta enumeración no crea un nuevo tipo (como se podría pensar). De hecho, de acuerdo con la norma, ESTADO es sólo otro nombre para int - y las constantes ALABAMA, ALASKA, y así sucesivamente son todos de tipo const int.

Video: Programacion en C - tipo de dato Enum

El compilador gcc proporciona realmente una enumeración declarado de esta manera un poco más autoridad que simplemente llamando a otra forma de int. En realidad se puede sobrecargar las funciones sobre la base de una enumeración tipo:

fn void (s ESTADO) fn -void (int n) -fn (Alaska) - // invoca fn (ESTADO)

El estándar de 2011 permite al programador crear un tipo completamente nuevo mediante el enumeración palabra clave. Dado que los creadores de la nueva norma no querían romper el código existente, la norma requiere la adición de una palabra clave adicional con el fin de definir un tipo de enumeración, como en el siguiente ejemplo:

ESTADO clase enum {DC, TERRITORIO = 0, Alabama, Alaska, // ... y así sucesivamente ...} -

Una clase de enumeración es ahora un tipo a gran escala como cualquier otra clase definida por el usuario. Lo siguiente no es legal, incluso más, por dos razones:

int s = Alaska-

En primer lugar, la constante ALASKA solamente se define dentro de la ESTADO espacio de nombres. Así, el nombre de la constante es ESTADO :: ALASKA. En segundo lugar, el tipo no es int pero ESTADO. No se puede asignar un valor de tipo ESTADO a una int.

ESTADO DEL ESTADO s = :: Alaska-

El programador puede refundir una ESTADO en una int pero debe hacerlo de forma explícita las conversiones -implicit no lo cortan con las clases de enumeración:

Video: Desarrollando en C — 32. Enumeraciones

int n = (int) ESTADO :: Alaska-

Este nuevo tipo de enumeración también puede basarse en uno de los otros tipos de número de recuento, además de sólo int:

Video: Tipos de variables en c

ESTADO clase de enumeración: char {DC, // ... el resto de la declaración es igual
Artículos Relacionados