Operatorüberladung

In C++ ist es möglich, die existierenden Operatoren für eigene Klassen zu definieren, so dass auch selbstgeschriebene Klassen nach dem Muster

Fraction a( 1, 2 ), b( 3, 4 ), c;

c = a + b;

zu beschreiben.Man kann arithmetische Operatoren (wie +, *, ++, …), aber auch Vergleiche (wie ==, >=, …) und Zuweisungen( =, +=, *=, …) für beliebige Klassen selbst definieren.

Auch kann man vorhandene Operatoren neu definieren - davon ist allerdings abzuraten.

Stattdessen kann man zusätzliche Operatoren definieren, so dass man beispielsweise die vorhandenen Additionen für zwei Integers, ein Integer und ein Float oder zwei Floats eine weitere Additionsbeschreibung hinzufügt: zum Beispiel wie man zwei Instanzen einer eigenen Klasse Fraction miteinander addiert. Diese Form von zusätzlichen Operatordefinitionen, so dass ein Operator auch mit mit eigenen Datentypen umgehen kann, nennt man Überladen, bzw. Operator-Überladung.

Der Vorteil ist hier, dass der Sourcecode leserlicher werden kann, wie der zuvor gezeigte Quelltext belegt. Gleichzeitig bedeutet die Tatsache, dass der Programmierer die Operatoren selbst definiert, dass er diszipliniert und überlegt beschreiben muss, was ein '+'-Operator zu leisten hat. Im Falle einer Klasse Fraction erwartet man sicherlich, dass die beiden Brüche miteinander addiert werden. Der Programmierer sollte also der Namensvorgabe des Operators folgen und entsprechend dieser eine Definition schreiben, die man auch in einer Funktion Add() oder Plus() erwarten würde. Die Variable 'c' sollte also nach der Ausführung von operator + mit dem Wert 5/4 beschrieben werden. Bei Zweideutigkeiten sollte man eindeutige Funktionsnamen vorziehen:

Vector v( 1, 2, 3 ), w( 4, 5, 6 ), r1, r2;

r1 = v.ScalarProduct( w );
r2 = v.CrossProduct( w );

Lasse Dich nicht dazu verleiten, alles zu überladen, was sich einem anderen Entwickler nicht sofort auf den ersten Blick erschließt. Nutze dann lieber aussagekräftige Funktionsnamen.

Wie überlade ich welchen Operator?

Folgende Operatoren gibt es in C++. Ihr Link führt zu einem Beispiel, wie die jeweilige Operatorklasse überladen werden kann.

Infix Operatoren

Arithmetische Operatoren: +, -, *, /, %
Bitmanipulierende Operatoren: |, &, ^
Logische Operatoren: ||, &&
Vergleichende Operatoren: ==, !=, >, >=, <=, <
Zuweisende Operatoren: =, +=, -=, *=, /=, %=, |=, &=, ^=, <<=, >>=
Shift, Im- und Export: >>, <<

Prefix

Logische Operatoren: !, ~
Inkrement und Dekrement: ++(), --()

Postfix

Inkrement und Dekrement: ()++, ()--

Zugriff

Index: []
Zugriff: *, ->, ->*
Functor: ()

Speichermanagement

Datentypen konvertieren

Datentypen: Konvertierung