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

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 213 — #251<br />

✐<br />

7.4. Argum<strong>en</strong>tos por defecto<br />

int main() {<br />

SuperVar A(’c’), B(12), C(1.44F);<br />

A.print();<br />

B.print();<br />

C.print();<br />

} ///:~<br />

En ese ejemplo la <strong>en</strong>umeración no ti<strong>en</strong>e nombre de tipo (es una <strong>en</strong>umeración<br />

sin etiqueta). Esto es aceptable si va a definir inmediatam<strong>en</strong>te un ejemplar de la<br />

<strong>en</strong>umeración, tal como se hace aquí. No hay necesidad de indicar el nombre del tipo<br />

de la <strong>en</strong>umeración <strong>en</strong> el futuro, por lo que aquí el nombre de tipo es opcional.<br />

La unión no ti<strong>en</strong>e nombre de tipo ni nombre de variable. Esto se d<strong>en</strong>omina unión<br />

anónima, y crea espacio para la unión pero no requiere acceder a los elem<strong>en</strong>tos de<br />

la unión con el nombre de la variable y el operador punto. Por ejemplo, si su unión<br />

anónima es:<br />

//: C07:AnonymousUnion.cpp<br />

int main() {<br />

union {<br />

int i;<br />

float f;<br />

};<br />

// Access members without using qualifiers:<br />

i = 12;<br />

f = 1.22;<br />

} ///:~<br />

Note que accede a los miembros de una unión anónima igual que si fueran variables<br />

normales. La única difer<strong>en</strong>cia es que ambas variables ocupan el mismo espacio<br />

de memoria. Si la unión anónima está <strong>en</strong> el ámbito del fichero (fuera de todas las funciones<br />

y clases), <strong>en</strong>tonces se ha de declarar estática para que t<strong>en</strong>ga <strong>en</strong>lace interno.<br />

Aunque ahora SuperVar es segura, su utilidad es un poco dudosa porque la<br />

razón de utilizar una unión principalm<strong>en</strong>te es la de ahorrar memoria y la adición de<br />

vartype hace que ocupe bastante espacio <strong>en</strong> la unión (relativam<strong>en</strong>te), por lo que<br />

la v<strong>en</strong>taja del ahorro desaparece. Hay un par de alternativas para que este esquema<br />

funcione. Si vartype controlara más de una unión (<strong>en</strong> el caso de que fueran del<br />

mismo tipo) <strong>en</strong>tonces sólo necesitaría uno para el grupo y no ocuparía más memoria.<br />

Una aproximación más útil es t<strong>en</strong>er #ifdefs alrededor del código de vartype,<br />

el cual puede <strong>en</strong>tonces garantizar que las cosas se utilizan correctam<strong>en</strong>te durante<br />

el desarrollo y las pruebas. Si el código ha de <strong>en</strong>tregarse, antes puede eliminar las<br />

sobrecargas de tiempo y memoria.<br />

7.4. Argum<strong>en</strong>tos por defecto<br />

En Stash3.h, examine los dos constructores para Stash. No parec<strong>en</strong> muy difer<strong>en</strong>tes,<br />

¿verdad. De hecho el primer constructor parece ser un caso especial del<br />

segundo pero con size inicializado a cero. Es un poco una pérdida de tiempo y<br />

esfuerzo crear y mant<strong>en</strong>er dos versiones difer<strong>en</strong>tes de una función similar.<br />

<strong>C++</strong> proporciona un remedio mediante los argum<strong>en</strong>tos por defecto. Un argum<strong>en</strong>to<br />

por defecto es una valor que se da <strong>en</strong> la declaración para que el compilador lo inserte<br />

213<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!