Curso de C++ (Página 23)

pagina022b Principal pagina024

CAPITULO 23 Funciones IV: Sobrecarga

Anteriormente hemos visto operadores que tienen varios usos, como por ejemplo *, &, << o>>. Esto es lo que se conoce en C++ como sobrecarga de operadores. Con las funciones existe un mecanismo análogo, de hecho, en C++, los operadores no son sino un tipo especial de funciones, aunque eso sí, algo peculiares.

Así que podemos definir varias funciones con el mismo nombre, con la única condición de que el número y/o el tipo de los parámetros sean distintos. El compilador decide cual de las versiones de la función usará después de analizar el número y el tipo de los parámetros. Si ninguna de las funciones se adapta a los parámetros indicados, se aplicarán las reglas implícitas de conversión de tipos.

Las ventajas son más evidentes cuando debemos hacer las mismas operaciones con objetos de diferentes tipos o con distinto número de objetos. Hasta ahora habíamos usado macros para esto, pero no siempre es posible usarlas, y además las macros tienen la desventaja de que se expanden siempre, y son difíciles de diseñar para funciones complejas. Sin embargo las funciones serán ejecutadas mediante llamadas, y por lo tanto sólo habrá una copia de cada una.

Esta propiedad sólo existe en C++, no en C.

Ejemplo:

#include <iostream.h>
 
int mayor(int a, int b); 
char mayor(char a, char b); 
double mayor(double a, double b);
 
int main() 
{ 
   cout << mayor('a', 'f') << endl; 
   cout << mayor(15, 35) << endl; 
   cout << mayor(10.254, 12.452) << endl; 
   return 0; 
}
 
int mayor(int a, int b) 
{ 
   if(a > b) return a; else return b; 
}
 
char mayor(char a, char b) 
{ 
   if(a > b) return a; else return b; 
}
 
double mayor(double a, double b) 
{ 
   if(a > b) return a; else return b; 
} 

Otro ejemplo:

#include <iostream.h>
 
int mayor(int a, int b); 
int mayor(int a, int b, int c); 
int mayor(int a, int b, int c, int d);
 
int main() 
{
   cout << mayor(10, 4) << endl;
   cout << mayor(15, 35, 23) << endl; 
   cout << mayor(10, 12, 12, 18) << endl; 
   return 0; 
}
 
int mayor(int a, int b) 
{ 
   if(a > b) return a; else return b; 
}
 
int mayor(int a, int b, int c) 
{ 
   return mayor(mayor(a, b), c); 
}
 
int mayor(int a, int b, int c, int d) 
{ 
   return mayor(mayor(a, b), mayor(c, d)); 
} 

El primer ejemplo ilustra el uso de sobrecarga de funciones para operar con objetos de distinto tipo. El segundo muestra cómo se puede sobrecargar una función para operar con distinto número de objetos. Por supuesto, el segundo ejemplo se puede resolver también con parámetros por defecto.

Ejercicio:

Propongo un ejercicio: implementar este segundo ejemplo usando parámetros por defecto. Para que sea más fácil, hacerlo sólo para parámetros con valores positivos, y si te sientes valiente, hazlo también para cualquier tipo de valor.


pagina022b Principal pagina024