BUSCAR
INDICE
INDICE DEL TEMA
OBJETIVOS
TEORIA
PALABRAS RESERVADAS
GLOSARIO
EJERCICIOS
RESUELTOS
AUTOEVALUACION
PROPUESTOS
ERRORES
ESTADISTICAS
INICIO
FAQS
LINKS
RECOMIENDANOS
QUIENES SOMOS
MAPA DEL WEB
COLABORAR
Tema 15 Sobrecarga de funciones y de operadores
Teoría: Sobrecarga de operadores

Los operadores de C++, al igual que las funciones, pueden ser sobrecargados (overloaded). Este es uno de los aspectos más característicos de este lenguaje. La sobrecarga de operadores quiere decir que se pueden redefinir algunos de los operadores existentes en C++ para que actúen de una determinada manera, definida por el programador, con los objetos de una clase determinada. Esto puede ser muy útil por ejemplo, para definir operaciones matemáticas con elementos tales como vectores y matrices. Así, sobrecargando adecuadamente los operadores suma (+) y asignación (=), se puede llegar a sumar dos matrices con una sentencia tan simple como:

C = A + B;

Otra capacidad muy utilizada es la de sobrecargar los operadores de inserción y extracción en los flujos de entrada y salida (>> y <<), de manera que puedan imprimir o leer estructuras o clases complejas con una sentencia estándar.

Los únicos operadores de C que no se pueden sobrecargar son el operador punto (.), el if aritmético (?:) y el operador sizeof. C++ añade otros 2 a esta lista: el scope resolution operator (::) y puntero a miembro de un objeto (.*).

El objetivo último de la sobrecarga de operadores es simplificar al máximo el código a escribir, a cambio de complicar algo la definición de las clases. Una clase que disponga de operadores sobrecargados es una clase más compleja de definir, pero más sencilla e intuitiva de utilizar.

Las ventajas de la sobrecarga de operadores terminan cuando se utiliza de modo que añade complejidad o confusión a los programas. Por ejemplo, aunque esté permitido por el lenguaje, no se deberá nunca utilizar el operador (-) para multiplicar matrices o el (+) para imprimir vectores.

La sobrecarga de operadores tiene dos limitaciones teóricas y una práctica:

· Se puede modificar la definición de un operador pero no su gramática, es decir, el número de operandos sobre los que actúa, la precedencia y la asociatividad.

· Es necesario que al menos un operando sea un objeto de la clase en la que se ha definido el operador sobrecargado.

· Como se verá más adelante al presentar el ejemplo cadena, la sobrecarga de operadores puede resultar bastante ineficaz, desde el punto de vista de utilización de los recursos del ordenador.

Un operador puede estar sobrecargado o redefinido varias veces, de tal manera que actúe de un modo distinto dependiendo del tipo de objetos que tenga como operandos. Es precisamente el tipo de los operandos lo que determina qué operador se utiliza en cada caso.

Un operador sobrecargado puede ser miembro o friend de la clase para la que se define(nunca las dos cosas a la vez). El que se defina de una forma u otra es en ocasiones cuestión de conveniencia o incluso de preferencia personal, mientras que en otros casos la decisión está impuesta. Habitualmente:

· Se suelen declarar miembros de la clase los operadores unarios (es decir, aquellos que actúan sobre un único objeto), o los que modifican el primer operando, como sucede con los operadores de asignación.

· Por el contrario, los operadores que actúan sobre varios objetos sin modificarlos (por ejemplo los operadores aritméticos y lógicos) se suelen declarar como friends.

Para los operadores sobrecargados miembro de una clase, el primer operando debe de ser siempre un objeto de esa clase, en concreto el objeto que constituye el argumento implícito. En la declaración y en la definición sólo hará falta incluir en la lista de argumentos el segundo operando. En los operadores friend el número de argumentos deberá ser el estándar del operador (unario o binario).