Beruflich Dokumente
Kultur Dokumente
Programacin en C++/Funciones
Estructuras
Streams
Funciones
Definiendo una funcin
Una funcin es un conjunto de lneas de cdigo que realizan una tarea
especfica y puede retornar un valor. Las funciones pueden tomar
parmetros que modifiquen su funcionamiento. Las funciones son
utilizadas para descomponer grandes problemas en tareas simples y
para implementar operaciones que son comnmente utilizadas durante
un programa y de esta manera reducir la cantidad de cdigo. Cuando
una funcin es invocada se le pasa el control a la misma, una vez que
esta finaliz con su tarea el control es devuelto al punto desde el cual la
funcin fue llamada.
<tipo> [clase::] <nombre> ( [Parmetros] )
{
cuerpo;
}
Ejemplo de una funcin
Para comenzar, vamos a considerar el caso en el cual se desea crear la funcin cuadrado(), misma que deber volver
el cuadrado de un nmero real (de punto flotante), es decir, cuadrado() aceptar nmeros de punto flotante y
regresar una respuesta como nmero flotante.
Nota: aunque para la funcin que veremos el tipo de retorno coincide con el tipo de parmetro pasado, algunas veces
las cosas pueden cambiar, es decir, no es obligatorio que una funcin reciba un parmetro de un tipo y que tenga que
regresar una respuesta de dicho tipo.
// regresar el cuadrado de un nmero
double cuadrado(double n)
{
return n*n;
}
Parmetros
Normalmente, las funciones operan sobre ciertos valores pasados a las mismas ya sea como constantes literales o
como variables, aunque se pueden definir funciones que no reciban parmetros. Existen dos formas en C++ de pasar
parmetros a una funcin; por referencia o por valor. El hecho es que si en una declaracin de funcin se declaran
parmetros por referencia, a los mismos no se les podr pasar valores literales ya que las referencias apuntan a
objetos (variables o funciones) residentes en la memoria; por otro lado, si un parmetro es declarado para ser pasado
por valor, el mismo puede pasarse como una constante literal o como una variable. Los parmetros pasados por
referencia pueden ser alterados por la funcin que los reciba, mientras que los parametros pasados por valor o copa
Programacin en C++/Funciones
no pueden ser alterados por la funcin que los recibe, es decir, la funcin puede manipular a su antojo al parmetro,
pero ningn cambio hecho sobre este se reflejar en el parmetro original.
Parametros por valor
La funcin cuadrado() (ver arriba) es un clsico ejemplo que muestra el paso de parmetros por valor, en ese
sentido la funcin cuadrado() recibe una copia del parmetro n. En la misma funcin se puede observar que se
realiza un calculo ( n*n ), sin embargo el parmetro original no sufrir cambio alguno, esto seguir siendo cierto an
cuando dentro de la funcin hubiera una instruccin parecida a n = n * n; o n*=n;.
Parametros por referencia
Para mostrar un ejemplo del paso de parmetros por referencia, vamos a retomar el caso de la funcin cuadrado,
salvo que en esta ocasin cambiaremos ligeramente la sintaxis para definir la misma. Veamos:
// regresar el cuadrado de un nmero
double cuadrado2(double &n)
{
n *= n;
return n;
}
Al poner a prueba las funciones cuadrado() y cuadrado2() se podr verificar que la primera de estas no cambia el
valor del parmetro original, mientras que la segunda s lo hace.
Funciones void
Bajo ciertas circunstancias se desear escribir funciones que no regresen valor alguno (esto sera algo parecido a
escribir procedures en Pascal) y para ello podemos declarar a la funcin como void. La palabra reservada void es
utilizada para declarar funciones sin valor de retorno y tambin para indicar que una funcin especfica no requiere
de parmetros. Por ejemplo, la funcin pausa() que se ver en seguida, no devolver valor alguno y la misma no
requiere de parmetros.
// esta funcin requiere de la librera iostream
void pausa(void)
{
cout << "Por favor presione <Enter> HOLA...";
cin.get();
cin.ignore(255, '\n'); // rechazar caracteres introducidos antes
de <Enter>
}
Programacin en C++/Funciones
Notas: se debe de aclarar que el uso de la palabra void dentro de los parentesis es opcional al momento de declarar
una funcin. Asi, la funcin pausa() podra haberse declarado como void pausa(), y la misma puede invocarse como:
pausa();.
Funciones anidadas
A diferencia de Pascal, el lenguaje C,C++ no permite anidar funciones, sin embargo, dentro de una funcon puede
existir la llamada a una o ms funciones declaradas previamente.
Programacin en C++/Funciones
buffer[i] = ( n & 1 ) + '0';
i++;
n >>= 1;
}
buffer[i] = '\0';
strrev(buffer);
}
// fin (n > 0)
return buffer;
}
Parmetros constantes
Los parmetros usados por una funcin pueden declararse como constantes ( const ) al momento de la declaracin de
la funcin. Un parmetro que ha sido declarado como constante significa que la funcin no podr cambiar el valor
del mismo ( sin importar si dicho parmetro se recibe por valor o por referencia ).
Ejemplo:
int funcionX( const int n );
void printstr( const char *str );
Programacin en C++/Funciones
#include <iostream>
#include <stdlib.h>
using namespace std;
// declaracin de prototipo
char *numstr(unsigned int, const int base = 10);
// punto de prueba
int main()
{
int n = 128;
cout << "decimal = " << n << ",
cout << "decimal = " << n << ",
cin.get();
}
Parmetros estructurados
Al igual que cualquier otro tipo los parmetros de tipo estruturado pueden pasarse por valor o por referencia, sin
embargo, podra ser que si una estructura es pasada por valor el compilador mostrara una advertencia ( warning )
indicando que se pasado por valor una estructura, puesto que el paso de estructuras por valor es permitido usted
puede ignorar la advertencia, pero lo mejor es pasar estructuras por referencia. Si una estructura es pasada por valor
y si esta es muy grande podria ser que se agotara la memoria en el segmento de pila ( Stack Segment ), aparte de que
Programacin en C++/Funciones
empleado e)
" << e.nombre << endl;
<< e.edad << endl;
<< e.sexo << endl;
}
// Parametro empleado pasado por referencia
void ImprimeEmpleadoR( empleado &e )
{
cout << "Nombre: " << e.nombre << endl;
cout << "Edad: " << e.edad << endl;
cout << "Sexo: " << e.sexo << endl;
}
// Parametro empleado pasado como puntero
void ImprimeEmpleadoP( empleado *e )
{
cout << "Nombre: " << e->nombre << endl;
cout << "Edad: " << e->edad << endl;
cout << "Sexo: " << e->sexo << endl;
}
Funciones sobrecargadas
C++, a diferencia del C estndar, permite declarar funciones con el mismo nombre y a esto se conoce como
sobrecarga de funciones. Las funciones sobrecargadas pueden coincidir en tipo, pero al menos uno de sus
parmetros tiene que ser diferente. En todo caso, si usted trata de declarar funciones sobrecargadas que coincidan en
tipo y nmero de parmetros el compilador no se lo permitir. Para poner un ejemplo vamos a considerar el caso de
dos funciones cuyo nombre ser divide, ambas regresarn el cociente de dos nmeros, salvo que una de ellas operar
sobre nmeros enteros y la otra lo har sobre nmeros reales ( de punto flotante ).
Nota: cuando en los programas se hace una llamada a una funcin sobrecargada, el compilador determina a cual de
las funciones invocar en base al tipo y nmero de parmetros pasados a la funcin.
#include <iostream.h>
#include <stdlib.h>
Programacin en C++/Funciones
using namespace std;
// divide enteros
int divide(int a, int b)
{
cout << "divisin entera" << endl;
return ( (b != 0) ? a/b : 0);
}
// divide reales
double divide(double a, double b)
{
cout << "divisin real" << endl;
return ( (b != 0) ? a/b : 0);
}
// punto de prueba
int main()
{
cout << divide(10, 3) << endl;
cout << divide(10.0, 3.0) << endl;
cin.get();
}
Nota: observe que la primera forma de declaracin es realmente variable el nmero de parmetros a procesar y en
estos casos se debe establecer el mecanismo para determinar cuando se ha procesado el ltimo de los argumentos, en
el segundo tipo de declaracin el nmero total de parmetros a procesar es igual al valor del parmetro num.
En el siguiente programa, por ejemplo, se define una funcin ( printstr ) que despliega una lista variable de cadenas
de caracteres.
Programacin en C++/Funciones
#include <iostream.h>
#include <stdarg.h>
// despliega una lista de cadenas, la ultima debe ser NULL
void printstr(...)
{
va_list ap;
char
*arg;
va_start(ap, 0);
while ( (arg = va_arg(ap, char*) ) != NULL) {
cout << arg;
}
va_end(ap);
}
int main()
{
printstr("Hola, ", "Esta es\n", "una prueba\n", NULL);
cin.get();
return 0;
}
En el programa que se listar en seguida, se define la funcin suma(), misma que operar sobre listas de nmeros
enteros, la funcin devolver la suma de dichos nmeros.
#include <iostream>
#include <stdarg.h>
using namespace std;
// Esta funcin opera sobre una lista variable de nmeros enteros
int suma( int num, ... )
{
int total = 0;
va_list argptr;
va_start( argptr, num );
while( num > 0 ) {
total += va_arg( argptr, int );
num--;
}
va_end( argptr );
return( total );
}
int main()
{
Programacin en C++/Funciones
Estructuras
Arriba Streams
Licencia
Creative Commons Attribution-Share Alike 3.0 Unported
http:/ / creativecommons. org/ licenses/ by-sa/ 3. 0/
10