Operatorüberladung + - * / % ^ & | ~ ! , = < > <= >= ++ -- « » == != && || += -= /= %= ^= &= |= *= «= »= [] () -> ->* new delete
Operatorüberladung Keine Überladung für . .* :: ?: sizeof -operator Neue Operatoren können nicht definiert werden Eigenschaften bleiben erhalten Unär/binär Assoziativität Priorität Ein Operand muss von einem Klassendatentyp sein
Operatorüberladung Überladung durch Memberfunktion (linker Operand vom Klassentyp) Nicht Memberfunktion (friend) Operatoren () und [] können nur durch Memberfunktionen überladen werden. (Beispiel Array- Klasse) Rückgabe einer Referenz, wenn das Ergebnisobjekt bereits existiert (+=, =, *= ...) Rückgabe des Objektes, wenn ein neues Objekt erzeugt wird (+, - ...)
Operatorüberladung Varianten Als Memberfunktion Der erste Operand muss vom Typ der eigenen Klasse sein erg_type operator@ () erg_type operator@ (arg_type operand2) Als Friend erg_type operator@ (arg_type op) erg_type operator@ (class_type op 1, arg_type op2) erg_type operator@ (arg_type op 1, class_type op2) Kommutativität ergibt sich nicht automatisch, es müssen dann zwei Operatorfunktionen realisiert werden.
Operatorüberladung Aufruf Aufruf durch Verwendung im Ausdruck mystring s1=“Hans “; s1=s1+“Huckebein“; Aufruf als Funktion s1=s1.operator+(“Huckebein“); oder s1.operator=(s1.operator+(“Huckebein“));
Operatorüberladung Konvertierung Ein Konstruktor mit nur einem Argument (beim Aufruf) heißt Konvertierungskonstruktor Konvertierung Fremdtyp → eigenen Klassentyp fraction(long num, long den=1); Um den impliziten Aufruf zu verhindern, kann explizit davor angegeben werden. (wird verwendet um Mehrdeutigkeiten aufzulösen, bedingt aber mehr Schreibaufwand)
Operatorüberladung Konvertierung Zur Konvertierung des eigenen Klassentyps in einen Fremdtyp kann man einen Konvertierungsoperator schreiben: operator double() {return (double)Num/Denom;} Angabe von explizit zur Verhinderung von Mehrdeutigkeiten möglich