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).
|