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 214 — #252<br />
✐<br />
Capítulo 7. Sobrecarga de funciones y argum<strong>en</strong>tos por defecto<br />
automáticam<strong>en</strong>te <strong>en</strong> el caso de que no se proporcione <strong>en</strong> la llamada a la función. En<br />
el ejemplo de Stash, se puede reemplazar las dos funciones:<br />
Stash(int size); // Zero quantity<br />
Stash(int size, int initQuantity);<br />
por ésta otra:<br />
Stash(int size, int initQuantity = 0);<br />
La definición de Stash(int) simplem<strong>en</strong>te se quita; todo lo necesario está ahora<br />
<strong>en</strong> la definición de Stash(int, int).<br />
Ahora, las definiciones de los dos objetos<br />
Stash A(100), B(100, 0);<br />
producirán exactam<strong>en</strong>te los mismos resultados. En ambos casos se llama al mismo<br />
constructor, aunque el compilador substituye el segundo argum<strong>en</strong>to de A automáticam<strong>en</strong>te<br />
cuando ve que que el primer argum<strong>en</strong>to es un <strong>en</strong>tero y no hay un<br />
segundo argum<strong>en</strong>to. El compilador ha detectado un argum<strong>en</strong>to por defecto, así que<br />
sabe que todavía puede llamar a la función si substituye este segundo argum<strong>en</strong>to,<br />
que es lo que usted le ha dicho que haga al no poner ese argum<strong>en</strong>to.<br />
Los argum<strong>en</strong>tos por defecto, al igual que la sobrecarga de funciones, son muy<br />
conv<strong>en</strong>i<strong>en</strong>tes. Ambas características le permit<strong>en</strong> utilizar un único nombre para una<br />
función <strong>en</strong> situaciones difer<strong>en</strong>tes. La difer<strong>en</strong>cia está <strong>en</strong> que el compilador substituye<br />
los argum<strong>en</strong>tos por defecto cuando no se pon<strong>en</strong>. El ejemplo anterior <strong>en</strong> un bu<strong>en</strong><br />
ejemplo para utilizar argum<strong>en</strong>tos por defecto <strong>en</strong> vez de la sobrecarga de funciones;<br />
de otra modo se <strong>en</strong>cu<strong>en</strong>tra con dos o más funciones que ti<strong>en</strong><strong>en</strong> signaturas y comportami<strong>en</strong>tos<br />
similares. Si las funciones ti<strong>en</strong><strong>en</strong> comportami<strong>en</strong>tos muy difer<strong>en</strong>tes, normalm<strong>en</strong>te<br />
no ti<strong>en</strong>e s<strong>en</strong>tido utilizar argum<strong>en</strong>tos por defecto (de hecho, debería preguntarse<br />
si dos funciones con comportami<strong>en</strong>tos muy difer<strong>en</strong>tes deberían llamarse<br />
igual).<br />
Hay dos reglas que se deb<strong>en</strong> t<strong>en</strong>er <strong>en</strong> cu<strong>en</strong>ta cuando se utilizan argum<strong>en</strong>tos por<br />
defecto. La primera es que sólo los últimos pued<strong>en</strong> ser por defecto, es decir, no puede<br />
poner un argum<strong>en</strong>to por defecto seguido de otro que no lo es. La segunda es que una<br />
vez se empieza a utilizar los argum<strong>en</strong>tos por defecto al realizar una llamada a una<br />
función, el resto de argum<strong>en</strong>tos también serán por defecto (esto sigue a la primera<br />
regla).<br />
Los argum<strong>en</strong>tos por defecto sólo se colocan <strong>en</strong> la declaración de la función (normalm<strong>en</strong>te<br />
<strong>en</strong> el fichero de cabecera). El compilador debe conocer el valor por defecto<br />
antes de utilizarlo. Hay g<strong>en</strong>te que pone los valores por defecto com<strong>en</strong>tados <strong>en</strong> la definición<br />
por motivos de docum<strong>en</strong>tación.<br />
void fn(int x /* = 0 */) { // ...<br />
7.4.1. Argum<strong>en</strong>tos de rell<strong>en</strong>o<br />
Los argum<strong>en</strong>tos de una función pued<strong>en</strong> declararse sin id<strong>en</strong>tificadores. Cuando<br />
esto se hace con argum<strong>en</strong>tos por defecto, puede parecer gracioso. Puede <strong>en</strong>contrarse<br />
214<br />
✐<br />
✐<br />
✐<br />
✐