Cuando programas en C++ y necesitas que una variable almacene distintos tipos de datos sin desperdiciar memoria RAM, las uniones y las enumeraciones se convierten en herramientas fundamentales. Ambas comparten una idea central: aprovechar un mismo espacio de memoria para representar valores que no van a coexistir al mismo tiempo, lo que resulta clave para escribir código eficiente.
¿Cómo funcionan las uniones en C++?
Una unión (union) es una estructura especial que permite almacenar diferentes tipos de datos en la misma dirección de memoria [0:30]. A diferencia de un struct, donde cada miembro ocupa su propio espacio, en una unión todos los miembros comparten el mismo registro.
Para declarar una unión se utiliza la palabra reservada union, seguida de un nombre y la definición de los miembros entre llaves [0:42]:
cpp
union numero_o_letra {
int numero;
char letra;
};
En este ejemplo, la unión numero_o_letra puede almacenar un entero o un carácter, pero solo uno a la vez. Ambos valores residen en el mismo bloque de memoria.
¿Cómo se usa una variable de tipo unión?
Crear e inicializar una variable de tipo unión es sencillo [1:30]:
cpp
union numero_o_letra x = {'A'};
Al imprimirla, el resultado depende de cómo la invoques [1:50]:
cpp
cout << x.numero << endl; // Imprime 65 (equivalente ASCII)
cout << x.letra << endl; // Imprime A
- Si accedes mediante
x.numero, el compilador interpreta los bits almacenados como un int.
- Si accedes mediante
x.letra, los interpreta como un char.
Esto ocurre porque, tal como se explica en las primeras clases del curso, los caracteres se almacenan en la memoria RAM como su equivalente numérico en la tabla ASCII [2:18]. La letra A corresponde al valor 65, por lo que ambas lecturas son coherentes con el mismo dato.
También es posible forzar la conversión con un cast estático [2:40]:
cpp
cout << (char)x.numero << endl; // Imprime A
cout << (int)x.letra << endl; // Imprime 65
¿Para qué sirven las enumeraciones en C++?
Las enumeraciones (enum) cumplen un propósito similar al de las uniones en cuanto a ahorro de memoria: permiten definir un conjunto finito de valores posibles para una variable, almacenando internamente solo un valor a la vez [3:12].
Se declaran con la palabra reservada enum seguida de un nombre y los valores posibles entre llaves [3:30]:
cpp
enum dias_de_la_semana {
lunes,
martes,
miercoles
};
¿Qué valor numérico tienen los elementos de un enum?
Cuando creas una variable de este tipo y la imprimes, el resultado es un número [4:05]:
cpp
enum dias_de_la_semana dia = martes;
cout << dia << endl; // Imprime 1
La computadora necesita una representación numérica para cada valor. Como no se especificó ninguna, el compilador asume un orden tipo array: el primer elemento vale 0, el segundo 1 y así sucesivamente [4:20].
¿Cómo personalizar los valores internos de una enumeración?
Es posible asignar equivalencias explícitas a cada elemento del enum [4:45]:
cpp
enum dias_de_la_semana {
lunes = 'L',
martes = 'M',
miercoles = 'X'
};
Al imprimir, el valor numérico corresponde al código ASCII del carácter asignado. Para mostrar la letra en lugar del número, basta con aplicar un cast a char [5:15]:
cpp
cout << (char)dia << endl; // Imprime M
¿Por qué combinar uniones y enumeraciones con punteros y estructuras?
Tanto las uniones como las enumeraciones se pueden integrar con punteros y estructuras para construir modelos de datos más complejos sin sacrificar eficiencia en el uso de memoria [5:40]. La clave está en entender que:
- Las uniones comparten un solo espacio de memoria para múltiples tipos de dato.
- Las enumeraciones restringen una variable a un conjunto definido de valores, cada uno con una representación numérica interna.
- Ninguna de las dos almacena todos sus posibles valores simultáneamente.
Dominar estos conceptos te prepara para el siguiente gran paso en C++: la programación orientada a objetos, donde la gestión eficiente de memoria y tipos de datos cobra aún más relevancia. ¿Has encontrado un caso práctico donde una unión te haya ahorrado memoria de forma significativa? Comparte tu experiencia.