Freigeben über


Allgemeine Regeln für Operatorüberladung

Die folgenden Regeln beschränken, z. B. überladene Operatoren implementiert werden.Allerdings gelten sie nicht an neu und die Löschen-Operatoren, die separat behandelt werden.

  • Sie können neue Operatoren, z. B. nicht definieren. **

  • Sie können die Bedeutung von Operatoren nicht neu definiert werden, wenn dies für die integrierten Datentypen angewendet wird.

  • Überladene Operatoren muss entweder eine nicht statische Klassenmember Funktion oder eine globale Funktion sein.Eine globale Funktion, dass der Zugriff auf geschützte benötigt oder private Klassenmember müssen als Friend dieser Klasse deklariert werden.Eine globale Funktion muss mindestens ein Argument annehmen, das von der Klasse oder dem Enumerationstyp ist, oder ein Verweis auf eine Klasse oder ein Enumerationstyp ist.Beispiele:

    // 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()
    {
    }
    

    Das vorangehende Codebeispiel deklariert den Kleiner-als-Operator als Memberfunktion. Allerdings werden die Additionsoperatoren als globale Funktionen deklariert, die Friend-Zugriff haben.Beachten Sie, dass mehr als eine Implementierung für einen angegebenen Operator bereitgestellt werden kann.Im Fall des vorherigen Additionsoperators zu verwenden sind die beiden Implementierungen bereitgestellt, um commutativity zu erleichtern.Sie ist einfach, wie wahrscheinlich dieses Operators, die PointPoint, int zu Pointhinzufügen usw. implementiert werden.

  • Operatoren Vorrang, befolgen Sie die Gruppierung und die Anzahl der Operanden, die durch die typische Verwendung mit integrierten Datentypen geöffnet werden.Daher gibt es keine Möglichkeit, zur Beschreibung der Begriff „hinzufügen 2 und 3 ein Objekt des Typs“ 2 Pointdie x-Koordinate und y-Koordinate der hinzuzufügenden 3 erwartet hinzugefügt werden soll.

  • Die unären Operatoren, die als Memberfunktionen deklariert werden, nehmen keine Argumente. Globale Funktionen als ob sie deklariert werden, nehmen ein Argument.

  • Die binäre Operatoren, die als Memberfunktionen deklariert werden, nehmen ein Argument. Globale Funktionen als ob sie deklariert werden, nehmen zwei Argumente.

  • Wenn ein Operator ein unärer oder als binärer Operator (&+, *, und -) verwendet werden kann, können Sie jede Verwendung separat überladen.

  • Überladene Operatoren können keine Standardargumente haben.

  • Alle überladenen Operatoren außeroperator=(Zuweisung) werden von abgeleiteten Klassen geerbt.

  • Das erste Argument für Memberfunktion überladene Operatoren ist immer den Klassentyp des Objekts, für das der Operator aufgerufen wird (die Klasse, in der der Operator deklariert oder eine von dieser Klasse abgeleitete Klasse.)Es werden keine Konvertierungen sind für das erste Argument angegeben.

Beachten Sie, dass die Bedeutung von den Operatoren vollständig geändert werden kann.Das schließt die Bedeutung von ADDRESS-von (**&Zuweisung) (=**Operatoren und Funktionsaufrufe) ein.Außerdem Identitäten, die für integrierte Datentypen auf gebaut werden können, können mithilfe der Operatorüberladung geändert werden.Beispielsweise sind die folgenden vier Anweisungen äquivalent, wenn Sie normalerweise vollständig ausgewertet werden:

var = var + 1;
var += 1;
var++;
++var;

Diese Identität kann nicht für Klassentypen auf gebaut werden, die Operatoren überladen.Darüber hinaus sind einige der Anforderungen, die bei der Verwendung dieser Operatoren für einfache Typen implizit sind für überladene Operatoren weniger strikt (relaxed).Zum Beispiel erfordert das Hinzufügen/der Zuweisungsoperator, +=, den linken Operanden, ein L-Wert sein, wenn sie zu den grundlegenden Typen angewendet werden. es gibt keine solche Anforderung, wenn der Operator überladen wird.

HinweisHinweis

Aus Gründen der Konsistenz ist es oft am besten zum Modell der integrierten Datentypen zu folgen, sofern überladene Operatoren definiert.Wenn die Semantik eines überladenen Operators sich deutlich von ihrer Wichtigkeit in anderen Kontexten unterscheidet, kann es sich als verwirrender sein.

Siehe auch

Referenz

Überladen von Operatoren