Funciones

Cualquier tarea puede ser dividida en unas subtareas, cada una de las cuales bien puede ser representada directamente en forma de un código o bien dividida en subtareas más pequeñas. Este método se llama refinamiento sucesivo. Las funciones sirven para escribir el código de programación de estas tareas a resolver. El código que describe lo que hace la función se llama definición de función:

encabezado_de_función
  {
   instrucción
  }

Todo lo que se encuentra antes de la primera llave es el encabezado de la definición de función, lo que viene entre las llaves es el cuerpo de la definición de función. El encabezado de la función contiene la descripción del tipo de valor devuelto, nombre del (identificador) y parámetros formales. La cantidad de parámetros traspasados a una función está limitada y no puede superar 64.

Se puede llamar a la función de otras partes del programa tantas veces como haga falta. En realidad, el tipo devuelto, identificador de la función y tipos de parámetros constituyen prototipo de función.

Un prototipo de función es la declaración de una función pero no su definición. Gracias a la declaración explícita del tipo devuelto y de la lista de tipos de argumentos, la prueba rigurosa de tipos y las conversiones implícitas de tipos son posibles durante la invocación de las funciones. Sobre todo, las declaraciones de funciones se utilizan muy a menudo en las clases para mejorar la lectura del código fuente.

La definición de función tiene que corresponder exactamente a su declaración. Cada función declarada tiene que estar definida.

Ejemplo:

double                       // tipo del valor devuelto
linfunc (double a, double b) // nombre de función y lista de parámetros
  {
                             // operador compuesto
   return (a + b);           // valor devuelto
  }

 

El operador return puede devolver el valor de la expresión que se encuentra en este operador. Si hace falta, el valor de la expresión se convierte al tipo del resultado de función. Se puede devolver los tipos simples, estructuras simples, punteros a objetos. Mediante el operador return no se puede devolver cualquier array, objetos de clases, variables del tipo de estructuras compuestas.

La función que no devuelve el valor tiene que ser descrita como la que tiene el tipo void.

Ejemplo:

void errmesg(string s)
  {
   Print("error: "+s);
  }

 

Los parámetros traspasados a la función pueden tener los valores por defecto que se definen por las constantes del tipo correspondiente.

Ejemplo:

int somefunc(double a,
             double d=0.0001,
             int n=5,
             bool b=true,
             string s="passed string")
  {
   Print("Parámetro obligatorio a=",a);
   Print("Se han pasado los siguientes parámetros: d = ",d," n = ",n," b = ",b," s = ",s);
   return(0);
  }

 

Si algún parámetro ha obtenido el valor default, todos los parámetros siguientes también deben tener el valor default.

Ejemplo de una declaración errónea:

int somefunc(double a,
             double d=0.0001,    // se ha declarado el valor por defecto 0.0001
             int n,              // el valor por defecto no aparece !
             bool b,             // el valor por defecto no aparece !
             string s="passed string")
  {                                          
  }           

Véase también

Sobrecarga, Funciones virtuales, Polimorfismo