zurück weiter

Operatoren überladen
Einführung

G.Eichelsdörfer
Staatliche Technikerschule Weilburg

Operatoren werden letzlich genau so aufgerufen wie Funktionen. Was bei Funktionen Parameter genannt wird, heißt bei Operatoren Operand(en). Ein Operator verarbeitet seine Operanden - so wie eine Funktion ihre Parameter verarbeitet. Der Aufruf eines Operators wird jedoch anders notiert als der Aufruf einer Funktion. Ein Operator wird vor oder hinter einen Operanden bzw. zwischen seine Operanden gesetzt. Sie kennen Operatoren aus der Mathematik bzw. vom Rechnen. Im Ausdruck (Term) 3 + 4 ist + der Additionsoperator, 3 und 4 sind darin die Operanden.

Es gibt eine feste Liste an Operatoren, die nicht erweitert werden kann. Zu jedem Operatorsymbol ist auch festgelegt, ob es einen unären (1 Operand), binären (2 Operanden) oder ternären Operator (3 Operanden) darstellt.

Unär sind beispielsweise die Vorzeichenoperatoren + und -, der Inkrementieroperator ++, der Dekrementieroperator --, der Negationsoperator ! sowie der Operator zur Bildung des Einerkomplements ~.

Binär sind beispielsweise die Operatoren zu den vier Grundrechenarten +, -, *, /, der Ausgabe- bzw. Linksschiebeoperator <<, der Einlese- bzw. Rechtsschiebeoperator >>, die Operatoren für logische und bitweise Verknüpfungen &&, &, ||, | sowie der Indexoperator [ ]. + und - können somit sowohl als unäre als auch als binäre Operatoren eingesetzt werden.

Der einzige ternäre Operator setzt sich aus einem Fragezeichen und einem Doppelpunkt zusammen und wird üblicherweise in bedingten Ausdrücken verwendet (Operand1 ? Operand2 : Operand3).

Operatoren können in C++ genau so überladen werden wie dies mit Funktionen möglich ist. Sie überladen eine Funktion, wenn Sie eine Funktion schreiben und dieser den Namen einer bereits existierenden Funktion geben. Weil der Compiler feststellen können muss, welche der Funktionen gleichen Namens aufzurufen ist, muss sich Ihre Funktion in ihrer Parameterliste von allen anderen Funktionen gleichen Namens eindeutig unterscheiden. Dabei kommt es ausschließlich auf die Anzahl an Parametern und deren Typen an. Die Parameternamen sind in diesem Zusammenhang unwesentlich. Die Liste an Parametertypen nennt man auch kurz die Signatur einer Funktion.

Beispiel:
int summe(int a, int b); // Signatur: int, int
double summe(double a, double b); // Signatur: double, double
double summe(double a[ ]int n); // Signatur: double[ ], int

Wenn Sie eine weitere Funktion mit dem Namen summe erstellen wollen, müssen Sie dieser eine Signatur geben, die sich von allen obigen unterscheidet.

Entsprechendes gilt für das Überladen von Operatoren. Insbesondere wenn Sie einen zusammengesetzten Typ definieren und einen Operator auf Variable dieses Typs anwenden wollen, müssen Sie den gewünschten Operator überladen. Die Kopfzeile eines Operators wird fast genau so zusammengestellt wie diejenige einer Funktion. Dort wo der Funktionsname steht, wird beim Operator das Schlüsselwort operator gefolgt vom Operatorsymbol eingesetzt.

Beispiel:
Sie wollen einen Additionsoperator + auf einen DoubleArray-Operanden und einen double-Operanden anwenden. Zu diesem Zweck muss der Operator + etwa wie folgt überladen werden.
DoubleArray operator +(const DoubleArray& a, double b);
Darin ist der linke Operand (vor dem +) vom Typ DoubleArray und der rechte Operand (hinter dem +) vom Typ double. Der Operator liefert als Resultat ein DoubleArray-Objekt.

Wenn Sie den obigen Operator wie eine Funktion implementiert haben (Funktionsrumpf mit Anweisungen), dann können Sie ein DoubleArray-Objekt mit einem einzelnen double-Wert per + verknüpfen:
DoubleArray DA;
double x;
...
DA = DA + x;

Es bleibt allerdings noch zu klären, was dieser Operator bewirken soll. Dazu finden Sie zweckmäßige Vorgaben auf den nächsten Seiten.

Aufgabe:

Kann der obige Operator auch mit der folgenden Anweisung aufgerufen werden? Begründen Sie Ihre Antwort!
DA = x + DA;