Funciones

Las funciones se declaran y se definen exactamente igual que en C, y, al igual que en éste, se puede utilizar prototipo (prototype).
Un prototipo es un modelo limitado de una entidad más completa que aparecerá después. En el caso de funciones, la función es la entidad completa que vendrá después, y la declaración de dicha función es el prototipo. El prototipo da un modelo de la interface a la función. Veamos un ejemplo:

# include <iostream.h>

void do_stuff (int wings, float feet, char eyes);

main()
{
   int arm = 2;
   float foot = 1000.0;
   char lookers = 2;

   do_stuff (3, 12.0, 4);
   do_stuff (arm, foot, lookers);
}

void do_stuff (int wings, float feet, char eyes)
{
   cout << "There are " << wings << "wings." << '\n';
   cout << "There are " << feet << "feet. " << '\n';
   cout << "There are " << int(eyes) << "eyes." << '\n';
}


La salida de este programa será:

There are 3 wings.
There are 12 feet.
There are 4 eyes.

There are 2 wings.
There are 1000 feet.
There are 2 eyes.

Cada llamada a la función do_stuff() debe verificar:

Nótese que cuando llamamos a la función, la comprobación de tipo la hace el compilador basándose en el prototipo (en la declaración) puesto que la función todavía no ha sido definida.
Los nombres de variables que aparecen en el prototipo son opcionales y actúan casi como comentarios al lector del programa, ya que son completamente ignorados por el compilador.

Tipos compatibles

Son compatibles cualquiera de los tipos simples (definidos en C++) que pueden ser convertidos de uno a otro de manera significativa. Por ejemplo, si llamamos con un entero a una función que está esperando un número real como parámetro, el sistema lo convertirá automáticamente, sin mencionarlo al usuario. Esto también es cierto de float a char, o de char a int.
En cambio, si pasamos un puntero a un entero a una función que estaba esperando un entero, no habrá conversión de tipo, ya que son dos variables completamente distintas. De la misma forma, un tipo definido por el usuario (estructura o clase) no puede ser convertido automáticamente a un long float, a un array o incluso a otra estructura o clase diferente, porque son tipos incompatibles y no puede realizarse la conversión de manera significativa.
Sin embargo, el tipo devuelto por la función, void en el ejemplo anterior, debe ser compatible con el tipo que se espera que devuelva en la función de llamada, o el compilador dará un warning.

Pequeños cambios

Volvamos al ejemplo anterior. Veamos qué sucede cuando hacemos pequeños cambios:
El uso de prototipos no supone coste alguno en tiempo ni en velocidad de ejecución. El prototipo se verifica durante la compilación. Ralentiza ésta, debido a que es una comprobación extra que el compilador debe hacer, pero es despreciable el tiempo que necesita. El prototipo sólo alarga el tamaño del código.
Free Web Hosting