Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
✐<br />
✐<br />
✐<br />
“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 114 — #152<br />
✐<br />
Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />
Comprobación de tipos para <strong>en</strong>umerados<br />
Las <strong>en</strong>umeraciones <strong>en</strong> C son bastante primitivas, simplem<strong>en</strong>te asocian valores<br />
<strong>en</strong>teros a nombres, pero no aportan comprobación de tipos. En <strong>C++</strong>, como era de<br />
esperar a estas alturas, el concepto de tipos es fundam<strong>en</strong>tal, y eso se cumple con<br />
las <strong>en</strong>umeraciones. Cuando crea una <strong>en</strong>umeración nombrada, crea efectivam<strong>en</strong>te un<br />
nuevo tipo, tal como se hace con una clase: El nombre de la <strong>en</strong>umeración se convierte<br />
<strong>en</strong> una palabra reservada durante esa unidad de traducción.<br />
Además, hay una comprobación de tipos mas estricta para la <strong>en</strong>umeración <strong>en</strong><br />
<strong>C++</strong> que <strong>en</strong> C. En particular, resulta evid<strong>en</strong>te si ti<strong>en</strong>e una instancia de la <strong>en</strong>umeración<br />
color llamada a. En C puede decir a++, pero <strong>en</strong> <strong>C++</strong> no es posible. Eso se debe a que<br />
el increm<strong>en</strong>tar una <strong>en</strong>umeración se realizan dos conversiones de tipo, una de ellas es<br />
legal <strong>en</strong> <strong>C++</strong> y la otra no. Primero, el valor de la <strong>en</strong>umeración se convierte del tipo<br />
color a int, luego el valor se increm<strong>en</strong>ta, y finalm<strong>en</strong>te el int se vuelve a convertir a<br />
tipo color. En <strong>C++</strong> esto no está permitido, porque color es un tipo difer<strong>en</strong>te de int.<br />
Eso ti<strong>en</strong>e s<strong>en</strong>tido, porque ¿cómo saber si el increm<strong>en</strong>to de blue siquiera estará <strong>en</strong> la<br />
lista de colores Si quiere poder increm<strong>en</strong>tar un color, debería ser una clase (con una<br />
operación de increm<strong>en</strong>to) y no un <strong>en</strong>um, porque <strong>en</strong> la clase se puede hacer de modo<br />
que sea mucho más seguro. Siempre que escriba código que asuma una conversión<br />
implícita a un tipo <strong>en</strong>um, el compilador alertará de que se trata de una actividad<br />
inher<strong>en</strong>tem<strong>en</strong>te peligrosa.<br />
Las uniones (descriptas a continuación) ti<strong>en</strong><strong>en</strong> una comprobación adicional de<br />
tipo similar <strong>en</strong> <strong>C++</strong>.<br />
3.8.4. Cómo ahorrar memoria con union<br />
A veces un programa manejará difer<strong>en</strong>tes tipos de datos utilizando la misma<br />
variable. En esta situación, se ti<strong>en</strong><strong>en</strong> dos elecciones: se puede crear un struct que<br />
cont<strong>en</strong>ga todos los posibles tipos que se puedan necesitar almac<strong>en</strong>ar, o se puede<br />
utilizar una union. Una union amontona toda la información <strong>en</strong> un único espacio;<br />
calcula la cantidad de espacio necesaria para el elem<strong>en</strong>to más grande, y hace de ese<br />
sea el tamaño de la union. Utilice la union para ahorrar memoria.<br />
Cuando se coloca un valor <strong>en</strong> una union, el valor siempre comi<strong>en</strong>za <strong>en</strong> el mismo<br />
sitio al principio de la union, pero sólo utiliza el espacio necesario. Por eso, se crea<br />
una «super-variable» capaz de alojar cualquiera de las variables de la union. Las<br />
direcciones de todas las variables de la union son la misma (<strong>en</strong> una clase o struct,<br />
las direcciones son difer<strong>en</strong>tes).<br />
A continuación, un uso simple de una union. Int<strong>en</strong>te eliminar varios elem<strong>en</strong>tos<br />
y observe qué efecto ti<strong>en</strong>e <strong>en</strong> el tamaño de la union. Fíjese que no ti<strong>en</strong>e s<strong>en</strong>tido<br />
declarar más de una instancia de un sólo tipo de datos <strong>en</strong> una union (a m<strong>en</strong>os que<br />
quiera darle un nombre distinto).<br />
//: C03:Union.cpp<br />
// The size and simple use of a union<br />
#include <br />
using namespace std;<br />
union Packed { // Declaration similar to a class<br />
char i;<br />
short j;<br />
int k;<br />
long l;<br />
114<br />
✐<br />
✐<br />
✐<br />
✐