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 64 — #102<br />

✐<br />

Capítulo 3. C <strong>en</strong> <strong>C++</strong><br />

función. Esta descripción es el «prototipo». Cuando la función es llamada, el compilador<br />

usa el prototipo para asegurar que los argum<strong>en</strong>tos pasados son los apropiados,<br />

y que el valor retornado es tratado correctam<strong>en</strong>te. Si el programador comete un error<br />

al llamar a la función, el compilador detecta el error.<br />

Es<strong>en</strong>cialm<strong>en</strong>te, apr<strong>en</strong>dió sobre prototipado de funciones (sin llamarlas de ese modo)<br />

<strong>en</strong> el capítulo previo, ya que la forma de declararlas <strong>en</strong> <strong>C++</strong> requiere de un prototipado<br />

apropiado. En un prototipo de función, la lista de argum<strong>en</strong>tos conti<strong>en</strong>e los<br />

tipos de argum<strong>en</strong>tos que se deb<strong>en</strong> pasar a la función y (opcionalm<strong>en</strong>te para la declaración),<br />

id<strong>en</strong>tificadores para los argum<strong>en</strong>tos. El ord<strong>en</strong> y tipo de los argum<strong>en</strong>tos<br />

debe coincidir <strong>en</strong> la declaración, definición y llamada a la función. A continuación<br />

se muestra un ejemplo de un prototipo de función <strong>en</strong> una declaración:<br />

int translate(float x, float y, float z);<br />

No se puede usar la misma sintaxis para declarar los argum<strong>en</strong>tos <strong>en</strong> el prototipo<br />

de una función que <strong>en</strong> las definiciones ordinarias de variables. Esto significa que no<br />

se puede escribir: float x, y, z. Se debe indicar el tipo de cada argum<strong>en</strong>to. En<br />

una declaración de función, lo sigui<strong>en</strong>te también es correcto:<br />

int translate(float, float, float);<br />

Ya que el compilador no hace más que chequear los tipos cuando se invoca la función,<br />

los id<strong>en</strong>tificadores se incluy<strong>en</strong> solam<strong>en</strong>te para mejorar la claridad del código<br />

cuando algui<strong>en</strong> lo está ley<strong>en</strong>do.<br />

En la definición de la función, los nombres son necesarios ya que los argum<strong>en</strong>tos<br />

son refer<strong>en</strong>ciados d<strong>en</strong>tro de la función:<br />

int translate(float x, float y, float z) {<br />

x = y = z;<br />

// ...<br />

}<br />

Esta regla sólo se aplica a C. En <strong>C++</strong>, un argum<strong>en</strong>to puede no t<strong>en</strong>er nombrado <strong>en</strong><br />

la lista de argum<strong>en</strong>tos de la definición de la función. Como no ti<strong>en</strong>e nombre, no se<br />

puede utilizar <strong>en</strong> el cuerpo de la función, por supuesto. Los argum<strong>en</strong>tos sin nombre<br />

se permit<strong>en</strong> para dar al programador una manera de «reservar espacio <strong>en</strong> la lista de<br />

argum<strong>en</strong>tos». De cualquier modo, la persona que crea la función aún así debe llamar<br />

a la función con los parámetros apropiados. Sin embargo, la persona que crea<br />

la función puede utilizar el argum<strong>en</strong>to <strong>en</strong> el futuro sin forzar una modificación <strong>en</strong> el<br />

código que llama a la función. Esta opción de ignorar un argum<strong>en</strong>to <strong>en</strong> la lista también<br />

es posible si se indica el nombre, pero siempre aparecería un molesto m<strong>en</strong>saje<br />

de advert<strong>en</strong>cia, informando que el valor no se utiliza, cada vez que se compila la<br />

función. La advert<strong>en</strong>cia desaparece si se quita el nombre del argum<strong>en</strong>to.<br />

C y <strong>C++</strong> ti<strong>en</strong><strong>en</strong> otras dos maneras de declarar una lista de argum<strong>en</strong>tos. Si se ti<strong>en</strong>e<br />

una lista de argum<strong>en</strong>tos vacía, se puede declarar esta como func() <strong>en</strong> <strong>C++</strong>, lo<br />

que indica al compilador que hay exactam<strong>en</strong>te cero argum<strong>en</strong>tos. Hay que t<strong>en</strong>er <strong>en</strong><br />

cu<strong>en</strong>ta que esto sólo significa una lista de argum<strong>en</strong>tos vacía <strong>en</strong> <strong>C++</strong>. En C significa<br />

«un número indeterminado de argum<strong>en</strong>tos» (lo que es un «agujero» <strong>en</strong> C ya que<br />

deshabilita la comprobación de tipos <strong>en</strong> ese caso). En ambos, C y <strong>C++</strong>, la declaración<br />

func(void); significa una lista de argum<strong>en</strong>tos vacía. La palabra clave void<br />

significa «nada» <strong>en</strong> este caso (también puede significar «sin tipo» <strong>en</strong> el caso de los<br />

64<br />

✐<br />

✐<br />

✐<br />

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

Saved successfully!

Ooh no, something went wrong!