Sobrecarga de operadores
La palabra clave operator declara una función especificando el significado de operator-symbol cuando se aplica a las instancias de una clase. Esto proporciona al operador más de un significado, o lo "sobrecarga". El compilador distingue entre los diferentes significados de un operador examinando los tipos de sus operandos.
type operator operator-symbol ( parameter-list )
Comentarios
Se puede redefinir la función de la mayoría de los operadores integrados de forma global o clase a clase. Los operadores sobrecargados se implementan como funciones.
El nombre de un operador sobrecargado es operatorx, donde x es el operador tal como aparece en la tabla siguiente. Por ejemplo, para sobrecargar el operador de suma, se define una función denominada operator+. Del mismo modo, para sobrecarga el operador de suma y asignación, +=, se define una función denominada operator+=.
Operadores redefinibles
Operador |
Nombre |
Tipo |
---|---|---|
, |
Coma |
Binary |
! |
NOT lógico |
Unario |
!= |
Desigualdad |
Binary |
% |
Módulo |
Binary |
%= |
Asignación y módulo |
Binary |
& |
AND bit a bit |
Binary |
& |
Dirección de |
Unario |
&& |
AND lógico |
Binary |
&= |
Asignación AND bit a bit |
Binary |
( ) |
Llamada a función |
— |
( ) |
Operador de conversión |
Unario |
* |
Multiplicación |
Binary |
* |
Desreferencia de puntero |
Unario |
*= |
Asignación y multiplicación |
Binary |
+ |
Adición |
Binary |
+ |
Unario más |
Unario |
++ |
Incremento 1 |
Unario |
+= |
Asignación y suma |
Binary |
– |
Resta |
Binary |
– |
Negación unaria |
Unario |
–– |
Decremento 1 |
Unario |
–= |
Asignación y resta |
Binary |
–> |
Selección de miembro |
Binary |
–>* |
Selección de puntero a miembro |
Binary |
/ |
División |
Binary |
/= |
Asignación y división |
Binary |
< |
Menor que |
Binary |
<< |
Desplazamiento a la izquierda |
Binary |
<<= |
Asignación y desplazamiento a la izquierda |
Binary |
<= |
Menor o igual que |
Binary |
= |
Asignación |
Binary |
== |
Igualdad |
Binary |
> |
Mayor que |
Binary |
>= |
Mayor o igual que |
Binary |
>> |
Desplazamiento a la derecha |
Binary |
>>= |
Asignación y desplazamiento a la derecha |
Binary |
[ ] |
Subíndice de matriz |
— |
^ |
OR exclusivo |
Binary |
^= |
Asignación y OR exclusivo |
Binary |
| |
OR inclusivo bit a bit |
Binary |
|= |
Asignación y OR inclusivo bit a bit |
Binary |
|| |
OR lógico |
Binary |
~ |
Complemento a uno |
Unario |
delete |
Delete |
— |
new |
New |
— |
conversion operators |
operadores de conversión |
Unario |
1 Existen dos versiones de los operadores de incremento y decremento unarios: preincremento y posincremento.
Vea Reglas generales de la sobrecarga de operadores para obtener más información. En los temas siguientes se describen las restricciones de las distintas categorías de operadores sobrecargados:
Los operadores que se muestran en la tabla siguiente no se pueden sobrecargar. La tabla incluye los símbolos de preprocesador # y ##.
Operadores no redefinibles
Operator |
Name |
. |
Selección de miembro |
.* |
Selección de puntero a miembro |
:: |
Resolución de ámbito |
? : |
Condicional |
# |
Conversión de preprocesador en una cadena |
## |
Concatenación de preprocesadores |
Aunque el compilador suele llamar implícitamente a los operadores sobrecargados cuando se encuentran en el código, se pueden invocar explícitamente de la misma manera que cualquier función miembro o no miembro:
Point pt;
pt.operator+( 3 ); // Call addition operator to add 3 to pt.
Ejemplo
En el ejemplo siguiente se sobrecarga el operador + para sumar dos números complejos y se devuelve el resultado.
// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;
struct Complex {
Complex( double r, double i ) : re(r), im(i) {}
Complex operator+( Complex &other );
void Display( ) { cout << re << ", " << im << endl; }
private:
double re, im;
};
// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
return Complex( re + other.re, im + other.im );
}
int main() {
Complex a = Complex( 1.2, 3.4 );
Complex b = Complex( 5.6, 7.8 );
Complex c = Complex( 0.0, 0.0 );
c = a + b;
c.Display();
}
Salida
6.8, 11.2