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

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

Saved successfully!

Ooh no, something went wrong!