Programmieren in C++
| |||||||||||||||||||||||||||||||||||||||||||||||
| CForm&
CForm::operator= ( const CForm& quelle ) {
} |
Will man Inkrement- oder Dekrementoperator überladen, muss man sich zwei
Dinge überlegen: Was genau soll verändert werden und wie löse ich die
Unterscheidung Posfix- und Präfixverwendung des Operators!?
Ich zeige hier den Operator ++, das dekrementieren funktioniert analog. Das Präfix
bedeutet, erhöhe erst den Wert und gib dann den erhöhten Wert zurück.
Beim Postfix ergibt sich das Problem, dass zwar der Wert erhöt werden muss BEVOR
als letztes die return-Anweisung den noch nicht erhöten Wert zurückgibt. Deshalb
muss in der Funktion zuerst eine Kopie des Originals angelegt werden.
Um dem Compiler zu erklären, welche Art des Operators (Post- oder Präfix) wir
gerade definieren, bekommt der Postfix-Op als Parameter eine Integer-Variable mit, die
wir aber im Quellcode nicht weiter beachten. Der Präfix-Op bleibt parameterlos.
Hier ein Beispiel mit einer Testklasse:
| class Test {
}; Test& Test::operator++()
} Test Test::operator++(int a)
} |
Hier möchte ich eine kurze Zusammenfassung - eine Art Formelsammlung - für das Überladen von Operatoren bieten. Man denke sich die jeweiligen Operatoren in die Deklaration einer Klasse mit dem Namen CLASS eingebunden. CLASS& ist entsprechend eine Referenz auf CLASS. Ich gebe jeweils an, was zurückgegeben werden soll. Das Label SINN sagt aus, dass ein Wert zurückgegeben wird, der dem Sinn des Operators entspricht (zum Beispiel einen Wert aus einer Liste beim Index-Operator [ ] ).
Der Zuweisungsoperator =
| Funktion: | CLASS& operator= ( const CLASS& quelle ); |
| Rückgabe: | return *this; |
| Bemerkung: | Wenn die Bedingung (this == &quelle) erfüllt ist, kann die Funktion gleich abgebrochen werden (Ziel = Quelle !) |
Inkrement - -, ++ (Präfix-Schreibweise)
| Funktion: | CLASS& operator--
( ); CLASS& operator++( ); |
| Rückgabe: | return *this; |
| Bemerkung: |
Inkrement - -, ++ (Postfix-Schreibweise)
| Funktion: | CLASS
operator-- ( int a ); CLASS operator++( int a ); |
| Rückgabe: | Zu Beginn der Funktion muss eine Kopie von this erstellt werden (CLASS kopie = this;). Dann wird diese Kopie mit return kopie; zurückgegeben. |
| Bemerkung: | Der Parameter (hier a) ist im Code nutzlos. Er identifiziert lediglich die Deklaration als Postfix-Schreibweise. |
Zeigerzugriffsoperator ->
| Funktion: | CLASS* operator-> (); |
| Rückgabe: | return &CLASS; |
| Bemerkung: | Wird verwendet, um auf Mebmer-Klassen von CLASS zugreifen zu können. |
Indexoperator [ ]
| Funktion: | TYP& operator[] (int i); |
| Rückgabe: | SINN |
| Bemerkung: | Die Funktion gibt im Normalfall einen Wert aus einem Array innerhalb der Klasse zurück |
Der Aufrufoperator ( )
| Funktion: | TYP& operator() (PARAMETERLISTE) const; |
| Rückgabe: | SINN |
| Bemerkung: | Der Aufrufoperator wird meist wie der Indexoperator verwendet. Man kann allerdings mehrere Parameter angeben, so dass Index-Zugriffe im Basic-Stil möglich werden. Der Zugriff ist dann von der Form CLASS(x,y) |
Natürlich kann man die Deklaration der Operatoren auch anders gestallten. Es ist ja der Sinn der Operatorüberladung, neue, eigene Funktionen zu definieren. Und tatsächlich kann uns kein Compiler hindern, den Indexoperator so zu überladen, das man damit eine Addition ausführt. Man muss nur den Rückgabewert und den Parameter entsprechend anpassen. Die hier gezeigten Deklarationen entsprechen lediglich der intuitiven Verwendung der jeweiligen Operatoren, und die sollten im Normalfall beibehalten werden!!!!
|
© Gerhard Zapf
|
||||
Letzte Änderung: 11.09.2003 |
||||