Funciones en C++.
Una función está formada por un conjunto de sentencias que realizan una determinada tarea y que podemos invocar mediante un nombre.
Un programa C++ está formado por una o más funciones.
Utilizando funciones podemos construir programas modulares. Además consiguen que no se repita el mismo código en varias partes del programa: en lugar de escribir el mismo código cuando se necesite, por ejemplo para validar una fecha, se hace una llamada a la función que lo realiza.
Todo programa C++ tiene una función llamada main. La función main es el punto de entrada al programa y también el punto de salida.
La estructura general de una función es la siguiente:
[tipo_devuelto] nombre_funcion([tipo parametro1][, tipo parametro2][, ....])
{
    // instrucciones
   [return valor;]
}
Los elementos que aparecen entre corchetes son opcionales.
Después del nombre de la función y siempre entre paréntesis puede aparecer una lista de parámetros, también llamados argumentos, separados por comas. Estos parámetros se conocen como parámetros formales.
Los parámetros formales son los datos que recibe la función para operar con ellos. Una función puede recibir cero o más parámetros. Se debe especificar para cada parámetro su tipo.
Una función puede devolver un dato a quien la ha llamado. Esto se realiza mediante la instrucción return. El tipo del dato devuelto debe coincidir con el tipo_devuelto que se ha indicado antes del nombre de la función.
Ejemplo de función C++ : función que sume dos números enteros

//Función C++ para sumar dos números
int suma(int a, int b)
{
         int c;
         c = a + b;
         return c;
}
Esta función se llama suma y recibe dos números enteros a y b. La función suma los dos números y guarda el resultado en c. Finalmente devuelve mediante la instrucción return la suma calculada.
Una función tiene un único punto de inicio, representado por la llave de inicio. La ejecución de una función termina cuando se llega a la llave final o cuando se ejecuta la instrucción return. La instrucción return puede aparecer en cualquier lugar dentro de la función, no tiene que estar necesariamente al final.
Con una función se deben realizar tres operaciones: declaración, definición y llamada o invocación.
Declaración o prototipo de una función.
Declarar una función es el paso previo antes de definir el conjunto de sentencias que la componen.
En la declaración o prototipo de la función, indicamos el nombre de la misma, el tipo de valor que devuelve y una lista parámetros separados por comas. La declaración acaba con punto y coma.
[tipo_devuelto] nombre_funcion([tipo parametro1][, tipo parametro2][, ....]);
La declaración de una función sirve para comprobar que cuando se llame a la función, los parámetros que se utilizan son correctos en cuanto a número y tipo, además de comprobar el tipo para el valor de retorno. El compilador dará mensajes de error si se llama a una función con tipos de datos o con números de parámetros distintos a los declarados.
Por ejemplo, la función suma del punto anterior se declara así:
int suma(int a, int b);
En la declaración de una función, no es necesario indicar los identificadores de los parámetros. Solo es obligatorio poner el tipo. Además, los identificadores usados en la declaración y en la definición no es preciso que sean los mismos.
Según esto, la función suma la podemos declarar así:
int suma(int, int);
Estamos indicando que suma recibe 2 enteros y devuelve un entero. No es necesario poner el nombre de las variables.


Definición de una función.
Definir una función consiste en escribir la cabecera de la misma y a continuación, entre llaves, el cuerpo de la función, es decir, sus instrucciones.
La cabecera de la función debe coincidir con la declaración de la función y debe incluir el nombre de los parámetros. La cabecera no acaba en punto y coma.
[tipo_devuelto] nombre_funcion([tipo parametro1][, tipo parametro2][, ....])
{
    // instrucciones
   [return valor;]
}
Los parámetros definidos en la cabecera de la función se llaman parámetros formales. Son las variables que reciben los valores de los argumentos en la llamada a la función.
El resultado de la función se devuelve a la instrucción que la ha llamado por medio de la sentencia return. El tipo_devuelto indica de qué tipo es el dato devuelto por la función. Puede ser cualquier tipo básico, o definido por el usuario, pero no puede ser un array o una función. Si no se indica, se supone que es int. La sentencia return puede aparecer más de una vez en el cuerpo de la función aunque lo aconsejable es que aparezca sólo una sentencia return. Si la función no devuelve ningún valor, se puede omitir o poner simplemente return. La sentencia return provoca la finalización inmediata de la función en el momento en que se ejecuta.

Llamar o invocar a una función.
Para que una función se ejecute es necesario llamarla o invocarla desde alguna parte del programa.
La llamada a una función está formada por su nombre seguido de una lista de argumentos entre paréntesis y separados por comas (cero o más argumentos) que son los datos que se le envían a la función.
Los argumentos que aparecen en la llamada a una función se llaman parámetros actuales, porque son los valores que se pasan a ésta en el momento de la ejecución.
Los parámetros actuales y los formales deben coincidir en número, orden y tipo. Si el tipo de un parámetro actual no coincide con su correspondiente parámetro formal, el sistema lo convertirá al tipo de este último, siempre que se trate de tipos compatibles. Si no es posible la conversión, el compilador dará los mensajes de error correspondientes.
Si la función devuelve un valor, la llamada a la función puede estar incluida en una expresión que recoja el valor devuelto.
Cuando se llama a una función, se crean en memoria las variables que aparecen en la cabecera de la función. Las variables declaradas en la cabecera de una función así como las que se declaran en el interior de la misma son variables locales de la función. Esto significa que solo son accesibles dentro de la función. Aunque tengan el mismo nombre que otras variables que puedan aparecer en otras partes del programa se trata de variables distintas. La memoria que ocupan las variables locales de una función se libera cuando acaba la ejecución de la función y dejan de estar accesibles.
Cuando se llama a una función, la ejecución del programa pasa a la función y cuando ésta acaba, la ejecución continúa a partir del punto donde se produjo la llamada.
Ejemplos de funciones en C++
Ejemplo 1:
El siguiente programa lee por teclado un año y calcula y muestra si es bisiesto. Para realizar el cálculo utiliza una función llamada bisiesto.
La función bisiesto recibe el año leído por teclado, comprueba si es o no bisiesto y devuelve 1 si lo es ó 0 si no lo es.
// Programa que lee un año y muestra si es o no bisiesto
#include <iostream>
using namespace std;
int bisiesto(int);   //declaración o prototipo de la función
int main()
{
   int anio;
   cout<<"Introduce a"<<(char)164<<"o: "; //164 ascii de ñ
   cin >> anio;
   if(bisiesto(anio))  //llamada a la función
      cout << "Bisiesto" << endl;
   else
      cout << "No es bisiesto" << endl;
   system("pause"); 
}
int bisiesto(int a)   //definición de la función    
{
    if(a%4==0 and a%100!=0 or a%400==0)
        return 1;
    else
        return 0;
}
En la llamada a la función bisiesto, el valor de la variable anio (parámetro actual) se copia en la variable a (parámetro formal) y la función trabaja con esta variable. El valor 1 ó 0 devuelto por return en la función pasa a ser el valor de la condición:


Ejemplo 2
Programa que lee por teclado la fecha actual y la fecha de nacimiento de una persona y calcula su edad.
El programa utiliza tres funciones:
fecha_valida: comprueba si la fecha leída es correcta.
bisiesto: comprueba si un año es bisiesto. La llama la función fecha_valida
calcular_edad: recibe las dos fechas y devuelve la edad.

// Programa C++ que lee la fecha actual y la fecha de nacimiento
// de una persona y calcula su edad
#include <iostream>
using namespace std;
int bisiesto(int);                   
int fecha_valida(int , int, int);
int calcular_edad(int, int, int, int, int, int);
int main()
{
   int diaa, mesa, anioa, dian, mesn, anion, edad;
   do
   {
       cout << "Introduce fecha actual: " << endl;
       cout << "dia : "; cin >> diaa;
       cout << "mes : "; cin >> mesa;
       cout << "a" << (char)164 << "o: "; cin >> anioa;
   }while(!(fecha_valida(diaa, mesa, anioa)));
   do
   {
       cout << endl << "Introduce fecha de nacimiento: " << endl;
       cout << "dia : "; cin >> dian;
       cout << "mes : "; cin >> mesn;
       cout << "a" << (char)164 << "o: ";  ; cin >> anion;
   }while(!(fecha_valida(dian, mesn, anion)));
   edad = calcular_edad(diaa, mesa, anioa, dian, mesn, anion);
   cout << endl << "Edad : " << edad << endl << endl;
   system("pause"); 
}

int calcular_edad(int da, int ma, int aa, int dn, int mn, int an)
{
    int edad = aa - an;
    if(ma < mn)
       edad--;
    else if(ma == mn and da < dn)
            edad--;
    return edad;
   
}                    

int bisiesto(int a)  // definición de la función bisiesto
{
    if(a%4==0 and a%100 !=0 or a%400==0)
        return 1;
    else
        return 0;
}

int fecha_valida(int d, int m, int a) //definición de fecha_valida
{
    if(d < 1 or d > 31 or m < 1 or m > 12 or a < 1)
    {
        return 0;
    }
    switch(m)
    {
        case 4:
        case 6:
        case 9:
        case 11: if(d > 30)
                 {
                    return 0;
                 }
                 break;
        case 2: if(bisiesto(a))
                {
                    if(d > 29)
                    {
                       return 0;
                    }
                }
                else if(d > 28)
                     {
                        return 0;
                     }
                break;
    }
    return 1;
}
La función fecha_valida se llama dos veces en el programa, una para comprobar si la fecha actual es correcta y otra para comprobar si la fecha de nacimiento es correcta. Esta Función devuelve 1 si es correcta y 0 en caso contrario. La función fecha_valida llama a la función bisiesto para comprobar si el año es bisiesto.
La función calcular_edad recibe las dos fechas y calcula y devuelve la edad de la persona. El valor de la variable edad que aparece en la sentencia return se copia en la variable edad de la llamada.