Il sovraccarico operatori è la possibilità di definire il comportamento personalizzato degli operatori standard (ad esempio, +, -, *, ==) per le proprie classi. Questo aiuta a scrivere codice espressivo e leggibile quando si lavora con tipi personalizzati (ad esempio, vettore, matrice).
Il meccanismo di sovraccarico operatori è stato introdotto in C++ per supportare una sintassi intuitiva quando si lavora con oggetti (ad esempio, somma di numeri complessi, lavoro con iteratori) proprio come si fa con i tipi di base.
Senza il sovraccarico operatori molte operazioni apparirebbero come normali funzioni (add(a, b)), il che complicherebbe la lettura del codice e ne diminuirebbe l'espressività. Tuttavia, un uso eccessivo o errato porta a confusione ed errori.
In C++ è possibile sovraccaricare la maggior parte degli operatori dichiarando funzioni membro o funzioni amiche appropriate per definire la logica delle nuove operazioni.
Esempio di codice:
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); } };
Caratteristiche chiave:
È possibile sovraccaricare l'operatore . (punto) e :: (due punti)?
No, operatori come . (punto), ::, sizeof, ?: e alcuni altri non possono essere sovraccaricati secondo lo standard del linguaggio.
Il comportamento degli operatori sovraccaricati deve necessariamente corrispondere alla loro semantica standard?
Non è obbligatorio, ma è consigliato (ad esempio, sovraccaricando ==, fare un confronto di equivalenza).
Cosa succede se un oggetto viene passato per valore in un operatore sovraccaricato in modo errato?
Si possono ottenere copie o dereferenziamenti non necessari, il che rallenterà il programma o porterà a un errore. È meglio passare un riferimento costante (const T&).
Esempio di codice:
Vector2D operator+(Vector2D rhs) const; // inefficiente, oggetto copiato
Nella classe DataFrame è stato sovraccaricato l'operatore * per il prodotto scalare con un effetto collaterale (modifica dell'oggetto).
Vantaggi:
Svantaggi:
Nella classe di numeri complessi sono stati sovraccaricati +, -, == con una logica matematica familiare, senza modificare gli oggetti originali.
Vantaggi:
Svantaggi: