13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

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 />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!