Regole generali per l'overload degli operatori
Le regole seguenti vincolano come operatori di overload vengono implementati.Tuttavia, non si applicano a nuovo e eliminazione operatori, che vengono analizzati separatamente.
Non è possibile definire nuovi operatori, come **.
Non è possibile ridefinire il significato degli operatori una volta applicato ai tipi di dati incorporati.
Operatori di overload devono essere una funzione non statica del membro della classe o una funzione globale.Una funzione globale che disponga di accesso ai membri della classe privati o protetti deve essere dichiarata come friend di tale classe.Una funzione globale deve accettare almeno un argomento che è di classe o di tipo enumerato o che è un riferimento a una classe o un tipo enumerato.Di seguito è riportato un esempio:
// rules_for_operator_overloading.cpp class Point { public: Point operator<( Point & ); // Declare a member operator // overload. // Declare addition operators. friend Point operator+( Point&, int ); friend Point operator+( int, Point& ); }; int main() { }
L'esempio di codice precedente viene dichiarata l'operatore minore di. come funzione membro, tuttavia, gli operatori di addizione vengono dichiarati come funzioni globali che hanno accesso friend.Si noti che più implementazioni può essere fornita per un operatore specificato.Nel caso dell'operatore di addizione precedente, le due implementazioni vengono fornite per facilitare l'operazione commutativa.È semplicemente come probabilmente tale operatori che aggiungono un oggetto Point a un oggetto Point, int a un oggetto Point, e così via, potrebbe essere implementato.
Gli operatori conformi alla precedenza, al raggruppamento e il numero di operandi ignorata dal loro utilizzo tipico con i tipi incorporati.Di conseguenza, non è possibile esprimere il concetto aggiunge 2 e 3 in un oggetto di tipo Point„, prevedendo 2 al progetto x coordinata e 3 al progetto y coordinata.
Gli operatori unari dichiarati come funzioni membro non accettano argomenti; se dichiarato come funzioni globali, accetta un argomento.
Gli operatori binari dichiarati come funzioni membro accetta un argomento; se dichiarato come funzioni globali, accetta due argomenti.
Se un operatore può essere utilizzato come operatore unario o binario (&, *, +e -), è possibile eseguire l'overload di separatamente ogni utilizzo.
Operatori di overload non può avere argomenti predefiniti.
Tutti gli operatori di overload esclusi assegnazione (**operator=**vengono ereditati dalle classi derivate.
Il primo argomento per gli operatori di overload funzione membro è sempre al tipo della classe dell'oggetto per il quale l'operatore viene richiamato (la classe in cui l'operatore viene dichiarato, o una classe derivata dalla classe).Nessuna conversione viene fornita per il primo argomento.
Si noti che il significato di uno degli operatori può essere modificato completamente.Che include il significato di indirizzo-di (&), assegnazione (=) e operatori di chiamata di funzione.Inoltre, le identità che possono essere basate su per i tipi incorporati possono essere modificate utilizzando l'overload degli operatori.Ad esempio, i quattro seguenti istruzioni vengono in genere equivalenti una volta completamente valutato:
var = var + 1;
var += 1;
var++;
++var;
Questa identità non può essere basata su per i tipi di classe che eseguono l'overload degli operatori.Inoltre, alcuni dei requisiti impliciti nell'utilizzo di questi operatori per i tipi di base sono di tipo relaxed degli operatori di overload.Ad esempio, aggiungi/operatore di assegnazione, +=, richiede l'operando sinistro di essere un l-value una volta applicato ai tipi di base; non vi è tale requisito quando l'operatore viene sottoposto a overload.
[!NOTA]
Per coerenza, è spesso consigliabile seguire il modello di tipi incorporati quando vengono definiti gli operatori di overload.Se la semantica di un operatore di overload differisce notevolmente dal significato in altri contesti, può essere più ambigua di utile.