|
|
Artículo realizado por
La sobrecarga es uno de los mecanismos más utilizados del C++ pues reporta una gran cantidad de beneficios a la hora de diseñar las prestaciones de nuestras funciones de miembro. Existen dos tipos fundamentales de sobrecarga: la sobrecarga de funciones y la sobrecarga de operadores. La sobrecarga de funciones consiste, básicamente, en crear funciones con el mismo nombre dentro de una clase pero con distinto tipo de argumentos de tal forma que, al llamar a la función el compilador se encargará de escoger la adecuada mediante la comparación de la lista de argumentos pasados en la invocación. Un sencillo ejemplo sería pensar en dos funciones llamadas ImprimirMensaje Podemos definirlas así: Como podéis observar, se llaman igual pero tienen argumentos distintos. Mientras que la primera no está preparada para recibir ningún tipo de datos, la segunda sí que lo está y esperará recibir una cadena de caracteres. Si ahora implementamos las funciones de esta forma: Si creáramos una instancia a la clase que contiene a esas dos funciones y llamáramos a la función Si, con esa misma instancia, llamáramos a la función
Fernando Rodríguez.
Capítulo 7.
Sobrecargando funciones y operadores.
Sobrecarga de funciones
void ImprimirMensaje(void);
void ImprimirMensaje (char *texto);
void NombreClase::ImprimirMensaje(void)
{
cout << "\n Esta es la función sin argumentos";
}
void NombreClase::ImprimeMensaje(char *texto)
{
cout << "\ n Esta es la función con argumentos
y ha recibido el mensaje " << texto;
}
ImprimeMensaje();
Obtendríamos por pantalla:
Esta es la función sin argumentos
ImprimeMensaje("Macedonia Magazine");
Lo que obtendríamos sería:
Esta es la función con argumentos y ha recibido el mensaje Macedonia Magazine
Como podéis observar, es muy sencillo sobrecargar funciones (más que sobrecargar operadores) y pueden ofrecer, sin un coste computacional demasiado elevado, prestaciones excelentes para trabajar dada la gran flexibilidad que proporcionan al programador. He aquí el ejemplo codificado formalmente:
#include <iostream.h> class SobrecargaFunciones { public: void ImprimeMensaje(void); void Imprime Mensaje(char* texto); }; void SobrecargaFunciones::ImprimirMensaje(void) { cout << "\n Esta es la función sin argumentos"; } void SobrecargaFunciones::ImprimeMensaje(char *texto) { cout << "\n Esta es la función con argumentos y ha recibido el mensaje " << texto; } int main(void) { SobrecargaFunciones sobrecarga; sobrecarga.ImprimeMensaje(); sobrecargaImprimeMensaje("Macedonia Magazine"); }
La sobrecarga de constructores se presenta como una de las aplicaciones más directas y comunes de aplicación de este mecanismo del C++, es más, la sobrecarga de constructores es algo que está "a la orden del día" para cualquier programador de C++ pues permite inicializar las instancias de muy distintas formas y dotar al objeto de unos valores iniciales acordes a la finalidad a la que vamos a llevar dicho objeto. Es muy común, pues, ver clases con muchos constructores. Por ejemplo:
class Personaje { public: Personaje(char *nombre); Personaje(); }
Aquí, podríamos decidir inicializar a la instancia con un nombre que el usuario ha introducido por teclado o bien, crear nosotros la instancia Personaje con un nombre por defecto llamando al constructor sin ningún tipo de argumentos.
La sobrecarga de operadores no es un mecanismo que los programadores de C++ recién iniciados se aventuren a utilizar ya que tardan un tiempo en "pillarle el truco" pero es masivamente utilizado en cualquier biblioteca de C++ como la MFC de Microsoft.
Pero, ¿en qué consiste una sobrecarga de operadores?. Sobrecargar operadores sirve para que las operaciones tales como la suma (+), resta (-), multiplicación (*), asignación (=), incremento (--), etc se comporten de forma diferente al trabajar con nuestros objetos, más exactamente, con los objetos preparados para soportar la sobrecarga de operadores. Imaginar que tenemos dos objetos de tipo Cadena. La clase Cadena está preparada para manejar una cadena de caracteres y darla funcionalidad a través de diversos métodos. Si nosotros quisiéramos sumar dos objetos de tipo Cadena, bastaría con tener sobrecargado el operador suma (+) para los objetos de dicha clase con lo que la siguiente sentencia sería válida:
Cadena cadena1, cadena2, cadenaResult; cadenaResult = cadena1 + cadena2;
Con esto podríamos conseguir, por ejemplo, que el objeto cadenaResult almacenara la concatenación de las cadenas de caracteres que soportan los objetos cadena1 y cadena2 respectivamente.
Cadena operator+(Cadena);
Con esto estaríamos declarando que estamos sobrecargando el operador suma (+) para que sea capaz de trabajar con argumentos (sumandos) que sean instancias a la clase cadena. Obviamente, para que esto funcione en la parte izquierda del operador asignación debe de haber otro objeto de tipo de Cadena, es decir, no podemos hacer esto:
int valor; valor = cadena1 + cadena2;
Recordemos que estamos sobrecargando el operador suma para que trabaje con objetos que sean instancias de la clase Cadena.
Los dos últimos capítulos que hemos visto sobre polimorfismo y sobrecarga nos ponen en condiciones de comenzar la recta final de este curso. El siguiente capítulo estará dedicado a las variables de miembro y funciones de miembro estáticas así como a las clases y funciones amigas por lo que volverán los largos capítulos y dejaremos casi acabado el curso. Hasta entonces ¡feliz programación!.
|
|