Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


3.2.3g Constantes de enumeración

§1 Sinopsis

Existe un tipo especial de variables denominadas variables enumeradas o simplemente enumeraciones ( 4.8 ). Se caracterizan por poder adoptar valores entre una selección de constantes enteras denominadas enumeradores, cuyos valores son establecidos en el momento de la declaración del nuevo tipo. Como se ha señalado, son enteros y (una vez establecidos) de valor constante, razón por la que se los denomina también constantes de enumeración.

Ejemplo:

enum estado { MALO =0, REGULAR =1, BUENO =2, EXTRA =3 };


La sentencia anterior declara estado como un tipo de variable de enumeración. Los miembros de esta clase pueden adoptar los valores indicados y son representados por los nemónicos: MALO, REGULAR, BUENO y EXTRA. Estas cuatro constantes son los enumeradores del nuevo tipo.

Como advertencia a lo indicado hasta aquí, no confundir la enumeración (la variable) con los enumeradores (las constantes enteras que delimitan el conjunto de valores posibles de la variable).  También resaltar que estado es un nuevo tipo de variable, en el mismo sentido que, por ejemplo, int o char son tipos, y que posteriormente es posible declarar instancias concretas del nuevo tipo y su valor correspondiente.  Por ejemplo:

estado mi_estado = EXTRA;

estado tu_estado = REGULAR;

 

std::cout << "Mi estado actual es: " << mi_estado << endl

     // -> Mi estado actual es: 3


En el caso anterior, estado es una enumeración (tipo genérico), mientras que mi_estado y tu_estado son instancias concretas del nuevo tipo, actualmente sus valores respectivos son 3 y 1. No confundir el tipo enum (genérico) con un tipo enum concreto, una "instancia" (variable enumerada) de ese tipo, ni con los valores concretos (constantes de enumeración) que puede adoptar

Para facilitar la legibilidad, los identificadores de las constantes de enumeración son nemónicos, y sus nombres suelen estar en mayúsculas, debido a una larga tradición C/C++ de representar de este modo las constantes.

Ya hemos señalado que estas constantes (enumeradores) son de tipo entero, por lo que pueden ser utilizadas en cualquier expresión donde sean permitidas las constantes enteras. Sus identificadores deben ser únicos dentro del ámbito de la declaración enum.  Se permiten inicializadores negativos; los valores que adoptan los enumeradores suelen ser únicos (aunque se permiten duplicidades). Para una visión más detallada de las declaraciones de estas constantes, ver enumeraciones ( 4.8 ) y la explicación que sigue sobre la palabra clave enum.

§2 Sintaxis:

enum [<nombre-de-tipo>] {<nombr-const> [= <valor>], ...} [lista_var];

Puede omitirse la palabra clave enum siempre que el nemónico <nombre-de-tipo> no sea empleado para nada más en el mismo ámbito. Ejemplo:

calidad { BUENA, REGULAR, MALA };

En este caso el compilador presupone que calidad es un enumerador, y no debe existir otra definición en el mismo ámbito de nombres. En otras palabras: calidad no debe utilizarse en el mismo ámbito para designar otro objeto.

<nombre-de-tipo> es una etiqueta opcional que identifica al conjunto. Puede omitirse si no se va a usar ninguna otra variable de este tipo de enumeración. Ejemplo:

enum { CIERTO, DUDOSO, FALSO };

<nombr-const> es el nombre de la constante de enumeración (enumerador), a la que opcionalmente puede asignarse el valor definido por <valor>.  En el ejemplo anterior son tres: CIERTO, DUDOSO y FALSO.

<valor> debe ser un entero (ya se ha señalado que los enumeradores son constantes enteras). Si no se especifica ningún valor, se supone que es <previo> + 1, donde <previo> es el valor del enumerador anterior de la lista (el valor por defecto para el primero es cero). <valor> puede ser cualquier expresión que resulte en un entero positivo o negativo (después de posible conversión a entero).

<lista_var> es una lista opcional de variables que son declaradas como del tipo enum que se define.


En el ejemplo que sigue se declara un tipo de enumeración de nombre genérico calidad; las variables de este tipo pueden adoptar tres valores: 0, 1 y 2, identificados respectivamente por los nemónicos BUENO, REGULAR y MALO; además se definen dos variables del nuevo tipo: nota y estado.

enum calidad { BUENO, REGULAR, MALO }, nota, estado;

§3 Descripción

La palabra clave enum define una enumeración, una lista de los valores (constantes enteros) que puede tomar una un tipo especial de variable a las que denominaremos variables enumeradas, con la particularidad de que, para mayor legibilidad, esta lista de valores esta representada por nemónicos. Por ejemplo, la declaración:

enum dias { DOM, LUN, MAR, MIE, JUE, VIE, SAB } diaX;

establece un tipo enum al que se identifica por dias; las variables de este tipo pueden adoptar un conjunto de seis valores enteros 0, 1, 2, 3, 4, 5, 6 (enumeradores) representados por los nemónicos DOM, LUN,...,SAB. Además se define una variable enumerada diaX de este tipo.

enum modelo { ULT =-1, BW40=0, C40, BW80, C80, MONO =7 };

En este ejemplo se define un tipo enum al que identificamos por la etiqueta modelo; las variables de este tipo pueden adoptar 6 valores (-1, 0, 1, 2, 3 y 7) que se identifican con los nemónicos: ULT, BW40, C40, BW80, C80 y MONO.

Los valores asignados a los enumeradores dependen del formato de la declaración y de la presencia de inicializadores opcionales. En el ejemplo:

enum color { ROJO, VERDE, AZUL };

ROJO, VERDE y AZUL son enumeradores del tipo color y pueden ser asignados a cualquier variable de tipo color o a cualquier otra variable de tipo entero. Los valores asignados a los enumeradores son:  ROJO == 0, VERDE == 1, AZUL == 2.

En el ejemplo siguiente:

enum color { ROJO, AZUL=2, VERDE = AZUL - 1 };

los enumeradores reciben los valores: ROJO = 0,  VERDE = 1, AZUL = 2.  Además, como puede comprobarse, las expresiones de inicialización pueden incluir enumeradores previamente declarados.

Los valores de los enumeradores no tienen porqué ser únicos, como en el ejemplo que sigue.

enum estado { BUENO, MALO = 1, REGULAR = 1 };