Operatorüberladung

Beispielprogramm: OPUEBER.CPP

Das Programm OPUEBER.CPP enthält Beispiele für das Überladen von Operatoren. Das ermöglicht Dir, eine Klasse von Objekten zu definieren und die Verwendung von normalen Operatoren für diese Klasse neu zu definieren. Das Ergebnis ist, daß die Objekte der Klasse genauso natürlich gehandhabt werden können wie vordefinierte Datentypen. Sie erscheinen als Teil der Sprache und nicht mehr als etwas von Dir Hinzugefügtes.

In diesem Fall überladen wir mit den Deklarationen in den Zeilen 11 bis 13 und den Definitionen in den Zeilen 17 bis 41 die Operatoren + und *. Wir deklarieren die Methoden als Freundfunktionen (friend). Täten wir das nicht, wären die Funktionen Teil eines Objektes und die Nachricht würde an dieses Objekt gesendet werden. Durch die Deklaration als Freundfunktion trennen wir diese vom Objekt und können die Methode quasi "ohne" Objekt aufrufen. Das erlaubt es uns, statt Objekt1.operator+(Objekt2) schlicht und einfach Objekt1 + Objkekt2 zu schreiben. Außerdem wäre ohne das friend Konstrukt ein Überladen mit einer Variable des Typs int als erstem Parameter nicht möglich, da wir an eine solche Variable keine Nachricht senden können, wie etwa int.operator+(Objekt1). Zwei der drei überladenen Operatoren verwenden eine ganze Zahl als ersten Parameter, die Deklaration als Freundfunktion ist also notwendig.

Es gibt kein Limit für die Anzahl an Überladungen pro Parameter. Du kannst jede beliebige Zahl an Überladungen eines Parameters durchführen, solange die Parameter für jede Überladung verschieden sind.

Der Methodenkopf in Zeile 17 illustriert die erste Überladung, die den Operator + betrifft. Wir geben den Rückgabetyp, gefolgt vom Schlüsselwort operator und dem Operator, den wir überladen wollen, an. Die beiden formalen Parameter und deren Typen führen wir in der Klammer an. Die Implementation der Funktion erfolgt in den Zeilen 19 bis 22. Dir ist sicherlich aufgefallen, daß die Implementationen von Freundfunktionen nicht Teil der Klasse sind, deshalb auch der Klassenname nicht angegeben ist. Die Implementation selbst ist biederes Handwerk und sollte Dir auf den ersten Blick einleuchten. Zu Illustrationszwecken vollbringen wir natürlich wieder mathematische Meisterwerke, Du kannst aber auch ganz einfach etwas Nützliches machen.

Die größte Außergewöhnlichkeit passiert in Zeile 57, wo wir die Methode mittels der Operatornotation aufrufen und nicht im normalen Format einer Nachricht, die wir an ein Objekt senden. Da die beiden Variablen Klein und Mittel Objekte der Klasse Box sind, wird das System nach einem Weg suchen, den Operator + mit zwei Objekten der Klasse Box zu verwenden und bei der eben diskutierten Methode operator+() fündig werden. Die Operationen, die wir in der Implementation der Methode durchführen müssen wie gesagt nicht so sinnlos sein, wie das, was wir hier demonstrieren.

In Zeile 59 weisen wir das System an, eine Variable vom Typ int zu einem Objekt der Klasse Box zu addieren, das System findet also die zweite Überladung des Operators + in Zeile 26 und führt diese aus. In Zeile 61 schicken wir das System auf die Suche nach einer Methode, die eine Konstante vom Typ int und ein Objekt der Klasse Box mit dem Operator * verbindet und es landet in Zeile 35. Beachte bitte, daß es nicht erlaubt wäre, den Operator * anders herum zu verwenden, also zum Beispiel Grosz * 4, da wir keine Methode definiert haben, die diese Typen in dieser Reihenfolge akzeptiert. Würden wir eine solche Methode definieren könnten wir auch die umgekehrte Schreibweise verwenden, wobei dies zu einem komplett anderen Ergebnis führen kann, da es sich ja um zwei verschiedene Methoden handelt und wir in der Implementation ganz nach unserem Gutdünken panschen können.

Wenn wir Operatorüberladung verwenden, verwenden wir gleichzeitig auch das Überladen von Funktionsnamen, da einige der Funktionsname gleich sind. Wenn wir Operatorüberladung in dieser Form verwenden, sehen unsere Programme so aus, als wäre die Klasse ein natürlicher Teil der Sprache selbst. Deshalb ist C++ eine erweiterbare Sprache und kann an das jeweilige Problem angepaßt werden.

(weiter...)