Sovraccarico di funzioni — è la possibilità di creare più funzioni con lo stesso nome ma con argomenti diversi. Questo è utilizzato per migliorare la leggibilità e garantire un'interfaccia intuitiva.
Sovraccarico di operatori — è la possibilità di definire come gli operatori standard funzionano con i tipi di dati utente (classi o strutture).
Limitazioni del sovraccarico degli operatori:
.:, .*, ::, sizeof, ?:, ecc.).Esempio di sovraccarico dell'operatore "+":
class Vector2D { public: float x, y; Vector2D(float _x, float _y): x(_x), y(_y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
È consentito in C++ sovraccaricare l'operatore virgola (
,) e, se sì, per cosa può essere usato?
Risposta:
Sì, l'operatore virgola può essere sovraccaricato per classi utente.
Tuttavia, è consigliabile sovraccaricare l'operatore virgola solo se ha un senso valido, poiché questo può confondere chi legge il codice e portare a conseguenze inaspettate.
struct Logger { Logger& operator,(const std::string& msg) { std::cout << msg; return *this; } };
Storia
All'interno di una libreria matematica, l'operatore==è stato sovraccaricato per confrontare oggetti, ma è stato dimenticato di sovraccaricare l'operatore<. Questo ha portato a errori di compilazione quando si tentava di utilizzare contenitori STL che richiedono un operatore di confronto, ad esempiostd::set,std::map.
Storia
Uno sviluppatore ha sovraccaricato l'operatore+per la classeMatrix, ma invece di restituire un nuovo oggetto ha sempre modificato l'operando sinistro. Il risultato sono stati effetti collaterali inaspettati e la violazione del principio di "pulizia" delle operazioni.
Storia
Durante il sovraccarico di una funzione con diversi tipi di argomenti, non è stato considerato il qualificatore const:void foo(SomeClass&); void foo(const SomeClass&);Questo ha portato a ambiguità nella chiamata della funzione e a errori di compilazione quando si passano oggetti temporanei.