ProgrammazioneSviluppatore C++

Che cos'è il sovraccarico di funzioni (Function Overloading) e il sovraccarico di operatori (Operator Overloading) in C++? Quali limitazioni esistono e quali sono i rischi degli errori nell'uso del sovraccarico? Fornisci un esempio di sovraccarico dell'operatore di somma per una classe utente.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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:

  • Non tutti gli operatori possono essere sovraccaricati (.:, .*, ::, sizeof, ?:, ecc.).
  • L'operatore deve essere o una funzione membro o una funzione amica.
  • Non è possibile ridefinire la semantica per creare una nuova sintassi completamente nuova.

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); } };

Domanda insidiosa.

È 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; } };

Esempi di errori reali dovuti a una scarsa comprensione delle sottigliezze dell'argomento.


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 esempio std::set, std::map.


Storia
Uno sviluppatore ha sovraccaricato l'operatore + per la classe Matrix, 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.