Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐