Funciones

Una función (unidad de ejecución también llamado procedimiento o método) es un bloque de sentencias que ejecuta una tarea específica y al que invocamos mediante un nombre. El bloque es el cuerpo de la función y el nombre del bloque es el nombre de la función. Cuando escribimos una función, además del cuerpo y el nombre de la misma, hay que especificar generalmente también los parámetros en los que se basan las operaciones que tendrá que realizar y el tipo de resultado que devolverá, Por ejemplo:

funcion

Un argumento es el valor que pasamos a la función cuando es llamada. Dicho valor se almacenará en el parámetro correspondiente de la función.

funcion_2

Según lo estudiado por ahora, habrá notado que cuando necesitamos realizar un determinado proceso y existe una función de la biblioteca de C++ que lo puede hacer, se utiliza esa función, en caso contrario escribiremos nosotros nuestra función.

Declaración de una función

 La declaración de una función, también conocida como prototipo de la función, indica, además del nombre de la función, cuántos parámetros tiene y de qué tipo son, así como  el tipo del valor devuelto. De la misma manera que en C++ es necesario declarar todas las variables, también toda función debe ser declarada antes de ser utilizada en la función o programa que realiza la llamada. De todas formas, ahora se verá que aquí hay una mayor flexibilidad que en el caso de las variables.

La declaración de una función se puede hacer de dos maneras:

  1. Mediante una definición previa de la función. Esta práctica es segura si la definición precede a la llamada, pero tiene el inconveniente de que si la definición se cambia de lugar el programa no funcionará.
  2. Mediante una declaración explícita, previa a la llamada. Esta es la práctica más segura y la que hay que tratar de seguir siempre. La declaración de la función se hace mediante el
    prototipo de la función, bien fuera de cualquier bloque, bien en la parte de declaraciones de un bloque.

El prototipo de una función es una plantilla que utilizamos para asegurar que la sentencia de llamada escrita antes de la definición de la función es correcta, esto significa, que son pasados los argumentos adecuados para los parámetros especificados en la función y que el valor devuelto es tratado correctamente. Por ejemplo, la sentencia siguiente indica que cuando sea invocada la función_a hay que pasarle dos argumentos, uno entero y otro real, y que dicha función devolverá un valor real cuando finalice la ejecución.

prototipo

En conclusión, la declaración de una función nos permite conocer las características de la misma, pero no define la tarea que realiza.

La lista de parámetros normalmente consiste en una lista de identificadores con sus tipos, separados por comas. En el caso del prototipo de una función, podemos omitir los identificadores por ser locales a la declaración. Por ejemplo:

prototipo_3

Sin embargo, cuando se especifiquen, su ámbito queda restringido a la propia declaración, lo que significa, que no son accesibles en otra parte. Veamos a continuación dos ejemplos de declaración y definición de la funcion_a.

Declaración:

funcion_a_1

Definición:

funcion_a_2

 Vemos que la funcion_a es llamada para su ejecución antes de su definición. Por lo tanto, el nombre de la función, el tipo de los argumentos pasados y el tipo del valor devuelto son verificados tomando como referencia la declaración de la función.

Si la definición de la función se escribe antes de cualquier llamada a la misma, no necesitamos escribir su declaración. Por ejemplo:

funcion_4

También puede estar vacía la lista de parámetros. Por ejemplo:

funcion_a_5

Para indicar que una función no devuelve nada, usamos la palabra reservada void. Por ejemplo:

funcion_6

Por último, cuando invocamos desde una función definida en nuestro programa, a otra función de la biblioteca C++, se necesita añadir su prototipo, exactamente igual que para cualquier otra función. Esta tarea es sencilla ya que las declaraciones de las funciones pertenecientes a la biblioteca estándar de C++, como sqrt, son proporcionadas por los ficheros de cabecera. Por eso, cuando un programa utiliza la función sqrt, observaremos que se incluye el fichero de cabecera cmath (en algunos compiladores basta con incluir iostream, ya que a través de este , están incluidos los otros).

cmath

 Definición de una función

 La definición de una función consta de una cabecera de función y del cuerpo de la función encerrado entre llaves:

definicion_funcion_1Las variables declaradas en el cuerpo de la función son locales y por definición solamente son accesibles dentro del mismo. Por ejemplo la siguiente función no acepta argumentos y no devuelve ningun valor:

definicion_funcion_2

Cuando una función devuelve un valor, éste es devuelto al punto donde se realizó la llamada a través de la sentencia return. La sintaxis es:

return [(]expresión[)];

 La sentencia return puede ser o no ser la última y puede aparecer más de una vez en el cuerpo de la función.

definicion_funcion_3

En el ejemplo anterior vemos que si a < 0 la función devuelve 0 terminando la ejecución del programa; si a > 0 la ejecución continúa y devolverá 1. No se puede especificar más de un elemento de datos a continuación de return (return x, y) ya que el tipo del valor devuelto solo se refiere a uno.

Cuando la función no devuelva ningún valor (void), se puede especificar simplemente return cuando sea necesario, o bien omitir si se trata del final de la función. Por ejemplo:

definicion_funcion_5

 ambitoEl siguiente ejemplo incluye una función f perteneciente a un espacio de nombres personalizado (miesnom) y otra función f perteneciente al espacio de nombres global. El espacio de nombres sólo contiene la declaración de la función, aunque podría haber contenido su definición. Por eso, al escribir la definición de esta función fuera del cuerpo del espacio de nombres hay que indicar el ámbito al que pertenece, de lo contrario sería tomada como una función global.

definicion_funcion_listado

Después de compilarlo y ejecutarlo mostrará:

definicion_funciones_salida

 Llamada a la función

La llamada a una función se hace incluyendo su nombre, seguido de una lista de argumentos
separados por comas y encerrados entre paréntesis, en una expresión o sentencia del programa principal o de otra función. A los argumentos incluidos en la llamada se les llama argumentos actuales, y pueden ser no sólo variables y/o constantes, sino también expresiones. Cuando el programa que llama encuentra el nombre de la función, evalúa los argumentos actuales contenidos en la llamada, los convierte si es necesario al tipo de los argumentos formales, y pasa copias de dichos valores a la función junto con el control de la ejecución.

c = funcion_a(a, b);
f();
miesnom::f();

Los argumentos a y b son las variables, se supone que definidas previamente, que almacenan los datos que se desean pasar a la función_a, el resultado devuelto por ésta es almacenado en la variable c especificada.

Función main

Todo programa C++ tiene una función main (solamente una). Esta función es el punto de entrada al programa y también el punto de salida (si termina la ejecución normalmente sin errores). Su definición es:

funcion_main_2

Vemos que la función main está diseñada para devolver un entero (int) y tiene dos parámetros que almacenarán los argumentos pasados en la línea de órdenes cuando invocamos al programa desde el sistema operativo para que se ejecute. También la función main puede escribirse sin argumentos:

funcion_main_1

atras2

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s