Operatorüberladung ist die Möglichkeit, das Benutzerverhalten von Standardoperatoren (z. B. +, -, *, ==) für eigene Klassen zu definieren. Dies hilft, ausdrucksvollen, lesbaren Code beim Arbeiten mit benutzerdefinierten Typen (z. B. Vektor, Matrix) zu schreiben.
Der Mechanismus der Operatorüberladung wurde in C++ eingeführt, um eine intuitive Syntax beim Arbeiten mit Objekten (z. B. die Addition komplexer Zahlen, die Arbeit mit Iteratoren) ähnlich wie bei grundlegenden Typen zu unterstützen.
Ohne Operatorüberladung würden viele Operationen wie gewöhnliche Funktionen (add(a, b)) aussehen, was das Lesen des Codes erschwert und dessen Ausdruckskraft verringert. Übermäßige oder falsche Verwendung kann jedoch zu Verwirrung und Fehlern führen.
In C++ kann man die meisten Operatoren überladen, indem man entsprechende Mitgliederfunktionen oder Freundfunktionen deklariert, um die Logik für neue Operationen festzulegen.
Codebeispiel:
class Vector2D { double x, y; public: Vector2D(double x, double y) : x(x), y(y) {} Vector2D operator+(const Vector2D& rhs) const { return Vector2D(x + rhs.x, y + rhs.y); } };
Hauptmerkmale:
Kann man den Operator . (Punkt) und :: (Doppelpunkt) überladen?
Nein, solche Operatoren wie . (Punkt), ::, sizeof, ?: und einige andere sind gemäß den Sprachstandards nicht überladbar.
Muss das Verhalten der überladenen Operatoren vollständig mit ihrer Standardsemantik übereinstimmen?
Muss nicht, wird aber empfohlen (zum Beispiel sollte bei der Überladung von == ein Äquivalenzvergleich durchgeführt werden).
Was passiert, wenn ein Objekt bei der Übergabe nach Wert an einen überladenen Operator falsch übergeben wird?
Es kann zu überflüssigen Kopien oder Dereferenzen kommen, was das Programm verlangsamen oder zu Fehlern führen kann. Es ist besser, eine konstante Referenz (const T&) zu übergeben.
Codebeispiel:
Vector2D operator+(Vector2D rhs) const; // ineffizient, Objekt wird kopiert
Im DataFrame-Klasse wurde der Operator * für das Skalarprodukt mit Nebenwirkung (Modifikation des Objekts) überladen.
Vorteile:
Nachteile:
In der Klasse der komplexen Zahlen wurden +, -, == mit gewohnter mathematischer Logik ohne Modifikation der Ausgangsobjekte überladen.
Vorteile:
Nachteile: