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.
Copyright © 1997, 1998, 2001-2006 Heinz Tschabitscher - Letzte Änderung 13. Dezember 2005
Heinz Tschabitscher - | Datenschutz | Impressum - Kommentare, Kritik, Anregungen, Erklärungen?