Freigeben über


Allgemeine Regeln für die Überladung von Operatoren

Die folgenden Regeln schränken die Art und Weise ein, wie überladene Operatoren implementiert werden. Sie gelten jedoch nicht für die neuen und Löschoperatoren , die separat behandelt werden.

  • Sie können keine neuen Operatoren definieren, z . B. ..

  • Sie können die Bedeutung von Operatoren nicht neu definieren, wenn sie auf integrierte Datentypen angewendet werden.

  • Überladene Operatoren müssen entweder eine nicht statische Klassenmemberfunktion oder eine globale Funktion sein. Eine globale Funktion, die auf private oder geschützte Klassenmember zugreifen muss, muss als Friend dieser Klasse deklariert sein. Eine globale Funktion muss mindestens ein Argument annehmen, das vom Klassen- oder Aufzählungstyp ist, oder das ein Verweis auf einen Klassen- oder Aufzählungstyp ist. Beispiel:

    // 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 vorhergehende Codebeispiel deklariert den Less Than-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 vorhergehenden Additionsoperators werden die beiden Implementierungen bereitgestellt, um Kommutativität zu ermöglichen. Es ist genauso wahrscheinlich, dass Operatoren, die einen Point zu einem Point, int zu einem Pointusw. hinzufügen, möglicherweise implementiert werden.

  • Operatoren unterliegen der Priorität, Gruppierung und Anzahl von Operanden, die durch ihre typische Verwendung mit integrierten Typen vorgegeben werden. Daher gibt es keine Möglichkeit, das Konzept "Add 2 and 3 to an object of type Point" auszudrücken, wobei erwartet wird, dass 2 der x-Koordinate und 3 der y-Koordinate hinzugefügt wird.

  • Unäre Operatoren, die als Memberfunktionen deklariert werden, akzeptieren keine Argumente. Wenn sie als globale Funktionen deklariert werden, nehmen sie ein Argument an.

  • Binäre Operatoren, die als Memberfunktionen deklariert werden, akzeptieren ein Argument. Wenn sie als globale Funktionen deklariert werden, nehmen sie zwei Argumente an.

  • Wenn ein Operator entweder als unär 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 mit Ausnahme der Zuordnung (operator=) werden von abgeleiteten Klassen geerbt.

  • Das erste Argument für mit Memberfunktionen überladene Operatoren weist immer den Klassentyp des Objekts auf, für das der Operator aufgerufen wird (die Klasse, in der der Operator deklariert ist, oder eine Klasse, die von dieser Klasse abgeleitet ist). Es werden keine Konvertierungen für das erste Argument bereitgestellt.

Beachten Sie, dass die Bedeutung aller Operatoren vollständig geändert werden kann. Dazu gehört die Bedeutung der Adress-von-,Zuordnungsoperatoren (=&), und Funktionsaufrufoperatoren. Auch Identitäten, auf denen integrierte Typen basieren können, können mithilfe der Operatorüberladung geändert werden. Beispielsweise sind die folgenden vier Anweisungen normalerweise gleichwertig, wenn sie vollständig ausgewertet werden:

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

Klassentypen, die Operatoren überladen, können nicht auf dieser Identität basieren. Darüber hinaus sind einige der Anforderungen, die für die Verwendung dieser Operatoren für grundlegende Typen gelten, für überladene Operatoren weniger strikt. Beispielsweise muss der Operator zum Hinzufügen/Zuweisen ein l-Wert sein, +=wenn er auf grundlegende Typen angewendet wird. Es gibt keine solche Anforderung, wenn der Operator überladen ist.

Hinweis

Aus Gründen der Konsistenz ist es oft am besten, beim Definieren überladener Operatoren das Modell der integrierten Typen zu befolgen. Wenn sich die Semantik eines überladenen Operators deutlich von seiner Bedeutung in anderen Kontexten unterscheidet, kann das eher verwirrend als nützlich sein.

Siehe auch

Operatorüberladung