La sobrecarga de operadores es la capacidad de definir el comportamiento de los operadores estándar (por ejemplo, +, -, *, ==) para las propias clases. Esto ayuda a escribir código expresivo y legible al trabajar con tipos personalizados (por ejemplo, vectores, matrices).
El mecanismo de sobrecarga de operadores apareció en C++ para soportar una sintaxis intuitiva al trabajar con objetos (por ejemplo, la suma de números complejos, trabajo con iteradores) de la misma manera que se hace con tipos básicos.
Sin la sobrecarga de operadores, muchas operaciones se verían como funciones normales (add(a, b)), lo que complica la lectura del código y disminuye su expresividad. Sin embargo, el uso excesivo o incorrecto lleva a confusiones y errores.
En C++, se pueden sobrecargar la mayoría de los operadores declarando las funciones miembro correspondientes o funciones amigas para definir la lógica de las nuevas operaciones.
Ejemplo de código:
class Vector2D { double x, y; public: Vector2D(double x, double y) : x(x), y(y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
Características clave:
¿Se puede sobrecargar el operador . (punto) y :: (dos puntos)?
No, operadores como . (punto), ::, sizeof, ?: y algunos otros no son sujetos a sobrecarga según el estándar del lenguaje.
¿Es obligatorio que el comportamiento de los operadores sobrecargados coincida completamente con su semántica estándar?
No es obligatorio, pero se recomienda (por ejemplo, al sobrecargar ==, hacer una comparación de equivalencia).
¿Qué sucederá si se pasa incorrectamente un objeto por valor al operador sobrecargado?
Se pueden obtener copias innecesarias o desreferenciaciones, lo que ralentizará el programa o provocará un error. Es mejor pasar una referencia constante (const T&).
Ejemplo de código:
Vector2D operator+(Vector2D rhs) const; // ineficiente, se copia el objeto
En la clase DataFrame, se sobrecargó el operador * para el producto escalar con un efecto secundario (modificación del objeto).
Ventajas:
Desventajas:
En la clase de números complejos, se sobrecargaron +, -, == con la lógica matemática habitual, sin modificar los objetos originales.
Ventajas:
Desventajas: