[Home]
für Einsteiger!
Seite:  [1] 2 3 4 - Drucken

Operatoren überladen

Wenn du einen eigenen Typ definieren willst, kann es sehr parktisch sein, wenn du ein paar Operatoren überlädst. Das ist für dich zwar ein ganzes Stück mehr Arbeit, aber der Programmierer, der deine Bibliothek nutzen soll/an deinem Projekt mitarbeitet, hat dafür VIEL weniger Arbeit...
Trotzdem ist es nicht immer nötig, Operatoren zu überladen...

Operatoren

Operatoren sind eigentlich auch nur Methoden. Die folgende Anweisung wird vom Compiler verstanden:
Quelltext
  1. int i;
  2. int k;
  3.  
  4. i=i+k; //oder: i+=k!
  5.  
  6. //Der Compiler denkt sich
  7. // i+k;
  8. //als:
  9. // i.operator+(k);
  10. //und ruft daher auf:
  11. // int.operator+(int)
  12.  

Liste der Operatoren:


Assoziativität:
Die arithmetischen Operatoren gruppieren von links nach rechts, d.h. "a - b - c" bedeutet dasselbe wie "(a - b) - c" und nicht "a - (b - c)". Dagegen gruppieren die Zuweisungsoperatoren von rechts nach links: Bei "a *= b = 5;" wird zuerst "b = 5" zugewiesen und dann "a" mit diesem Wert multipliziert ("*=")!

überladbare Operatoren

Operator Parameteranzahl Funktion Priorität Assoziativität
+ 1 arithm. Vorzeichen 14 r-l
+ 2 Addition 12 l-r
- 1 arithm. Vorzeichen 14 r-l
- 2 Subtraktion 12 l-r
++ 1 Inkrement 14 r-l
-- 1 Dekrement 14 r-l
* 2 Multiplikation 13 l-r
/ 2 Division 13 l-r
% 2 Modulo 13 l-r
^ 2 bitweises exklusives Oder 7 l-r
& 2 bitweises Und 8 l-r
| 2 bitweises Oder 6 l-r
~ 1 bitweises Nicht (Komplement) 14 r-l
&& 2 logisches Und 5 l-r
|| 2 logisches Oder 4 l-r
! 1 logisches Nicht 14 r-l
<< 2 bitweise Linksverschiebung 11 l-r
>> 2 bitweise Rechtsverschiebung 11 l-r
= 2 Wertzuweisung 2 r-l
+=, -=, *=,
/=, %=, ^=,
&=, |=,
>>=, <<=
2 Wertzuweisung 2 r-l
== 2 Gleichheit 9 l-r
!= 2 Ungleichheit 9 l-r
< 2 kleiner 10 l-r
> 2 größer 10 l-r
<= 2 kleiner oder gleich 10 l-r
>= 2 größer oder gleich 10 l-r
->* 2 Komponentenzeigerdereferenzierung 14 r-l
* 1 Dereferenzierung 14 r-l
& 1 Addressermittlung 14 r-l
, 2 sequentielle Auswertung 1 l-r
[] 2 Indizierung (ein Element zurückgeben) 15 l-r
() n Funktionsaufruf 15 l-r
(Typ) 1 Typkonveration (Umwandlung) 14 r-l
new n Speicheranforderung 15 r-l
delete n Speicherfreigabe 15 r-l
Keine Garantie!

nicht überladbare Operatoren

Operator Parameteranzahl Funktion Priorität Assoziativität
:: 1 globale Geltungbereichsangabe (Qualifizierung) 17 r-l
:: 2 klassenspezifische Qualifizierung 17 l-r
. 2 Komponenetenselektion 16 l-r
.* 2 Komponentenzeigerdereferenzierung 14 l-r
?: 3 Bedingung (wie if/else) 3 r-l
sizeof 1 Speicherbedarf 14 l-r
Keine Garantie!

Member oder nicht Member - das ist hier die Frage

Betrachten wir die beiden folgenden Ausdrücke:

klasse test;
test+1; //1)
1+test; //2)

Du denkst jetzt sicher, dass das das gleiche ist. Ätsch! Reingefallen! Der Compiler schreibt die beiden Ausdrücke um:
test+1; test.operator+(1); => Member/Methode
1+test; 1.operator+(test); => Non-Member/Funktion

Operatoren überladen

Um einen Operator zu überladen, muss man einfach eine Methode schreiben, die "operator##" heißt, wobei "##" für einen der oben genannten Operatoren steht. Außerdem muss man auf Rückgabewerte und Parameter achten. Mehr zum Überladen von Operatoren im Beispiel auf der nächsten Seite!

Wie geht's weiter?

Eine Beispielklasse
Seite:  [1] 2 3 4 - Drucken