Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.4 Funciones

"Generally, the craft of programming is the factoring of a set of requirements into a set of functions and data structures". Douglas Crockford en "JavaScript: The Good Parts".

§1 Sinopsis

Desde un punto de vista práctico, podemos decir que una función es una parte de un programa (subrutina) con un nombre, que puede ser invocada (llamada a ejecución) desde otras partes tantas veces como se desee. Un bloque de código que puede ser ejecutado como una unidad funcional. Opcionalmente puede recibir valores; se ejecuta y puede devolver un valor. Desde el punto de vista de la organización, podemos decir que una función es algo que permite un cierto orden en una maraña de algoritmos. Como resumen de lo anterior podemos concluir que el uso de funciones se justifica en dos palabras: organización y reutilización del código. Desde este último punto de vista (reutilización), puede decirse que son un primer paso de la programación genérica ( 4.12), ya que representan un algoritmo parametrizado [2].

Una vez expuesta la definición, señalemos que las funciones son la parte central de la programación C++. Algunos lenguajes, como Pascal, distinguen entre procedimientos ("Procedures") y funciones. En C++ las funciones desempeñan ambos papeles, aunque en cierto modo, los ficheros C++ desempeñan algunas funcionalidades de lo que, en otros lenguajes como Modula-2, se denominan módulos [3]. Otra diferencia substancial es que C++ no permite el anidamiento de funciones, es decir, definir funciones dentro de otras. En C++ todas las funciones se definen a nivel de fichero, con lo que tienen ámbito global al fichero ( 4.1.3 Ámbito de función).

Nota: existe una excepción a esta regla; se refiere a las funciones miembro de las clases, que pueden ser declaradas y definidas dentro de las propias clases. Aunque las clases no son por supuesto funciones en el sentido estricto, si representan cierta compartimentación de datos y procedimientos (un tipo de "módulos"). Por ejemplo, en C++ es válido el siguiente código:

int i;
class C {                  // definición de la clase
  public:
  char* func1(void) {      // declaración-definición de func
    return p;
  }
  char* func2(void);       // declaración de func2
  char * p;
};                         // termina definición de la clase
...
C::char* func2(void) {     // definición de func2
  ...
}

§2 Funciones dentro de clases

En la jerga de la programación orientada a objetos, las funciones dentro de las clases se denominan funciones-miembro o métodos, y las variables dentro de clases, variables-miembro o propiedades. El sentido es el mismo que en la programación tradicional (la nomenclatura es más una cuestión de gustos), si bien referirnos a "propiedades" y "métodos" supone estar utilizando la programación orientada a objetos y que nos referimos a miembros de una clase. En C++ esta aclaración puede ser importante, porque es un lenguaje que podríamos llamar "híbrido"; en ciertas partes puede utilizarse con técnicas de programación tradicional, y en otras con técnicas de POO.

§3 Una función de inicio

Cada programa C++ debe tener una sola función externa denominada main(), principal ( 4.4.4), que desde la óptica del programador define el punto de entrada al programa. Las funciones se declaran en cabeceras (estándar o específicas de usuario) o dentro de los ficheros fuente. Estas declaraciones son denominadas prototipos. En ocasiones la declaración y definición se realiza en el mismo punto (como ocurre con las variables), aunque es normal colocar al principio del fuente los "prototipos" de las funciones que serán utilizadas en su interior, y las definiciones en cualquier otro sitio (generalmente al final).  En el caso del ejemplo anterior, la declaración y definición de func1 se ha realizado en el mismo punto, mientras que la declaración de func2 se realiza dentro del cuerpo de la clase y la definición en el exterior de esta [1].


La forma general del prototipo de una función es:

valor-devuelto nombre-función (lista-de-argumentos);

La forma general de la definición es:

valor-devuelto nombre-función (lista-de-argumentos) {
  sentencias;         // "cuerpo" de la función
}

Ejemplo:

float cuadrado (float x);                // prototipo
float cuadrado (float x) { return x*x; } // definición


La comunicación entre el programa y las funciones que lo componen se realiza mediante los argumentos de llamada, los valores devueltos y las variables globales y externas.

§4 El operador de invocación a función

En ocasiones, en especial al tratar la sobrecarga de operadores ( 4.9.18), es conveniente considerar una invocación del tipo

func(lista-de-argumentos);

como un operador binario ( 4.9); el denominado operador de invocación a función ( ) ( 4.9.16) que se aplica entre el primer argumento func y el segundo, lista-de-argumentos. En este sentido la invocación anterior sería equivalente a:

func()lista-de-argumentos.

  Inicio.


[1] Las funciones miembro de clases (métodos) deben ser declaradas siempre dentro del cuerpo de la clase, aunque la definición puede estar fuera ( 4.11.2a).

[2]  Las funciones han sido definidas como los verbos de los lenguajes de programación (indican alguna acción). Algunos autores mantienen que la función es una unidad lógica de programación, y que su extensión debe limitarse al código que pueda incluirse en una pantalla, con objeto de que pueda tenerse una visión completa de la misma de un solo vistazo y sea más fácil de entender el funcionamiento de cada unidad lógica del programa.

[3] Los módulos de otros lenguajes pueden ser fácilmente mimetizados en C++ definiendo clases en las que todos sus miembros sean estáticos ( 4.11.7).