C++-Programmierung: Operator-Überladung
Eine aktuelle Seite zum gleichen Thema ist unter C++-Programmierung/ Eigene Datentypen definieren/ Operatoren überladen verfügbar.
Um Operationen im Quellcode einfacher darstellen zu können, kann man Operatoren wie Funktionen überladen.
Nachdem man eine Klasse Bruch
zum Rechnen mit rationalen Zahlen erstellt hat, möchte man mit diesen auch wie mit normalen Zahlen rechnen können. Da bruch1.addieren(bruch2)
aber umständlich aussieht, kann man den +-Operator überladen, damit man dann einfach bruch1 + bruch2
schreiben kann.
Überladbare Operatoren
[Bearbeiten]Arithmetische Operatoren
[Bearbeiten]+ - * / %
Inkrement, Dekrement
[Bearbeiten]++ --
Vergleichsoperatoren
[Bearbeiten]== != < > <= >=
Logische Operatoren
[Bearbeiten]&& || !
Zuweisungsoperatoren
[Bearbeiten]= += -= *= /= %= &= |= ^= ~= <<= >>=
Bitoperatoren
[Bearbeiten]& | ^ ~ << >>
Funktionsaufruf, Indexoperator
[Bearbeiten]() []
Sonstige Operatoren
[Bearbeiten]& * -> , new delete
Implementierungsarten
[Bearbeiten]als Member-Funktion
[Bearbeiten]Wird der Operator als Member-Funktion implementiert, wird der erste, bzw. bei unären Operatoren der einzige, Operand durch das aktuelle Objekt (this) repräsentiert. Somit muss bei unären Operatoren kein und bei binären nur noch ein Funktionsparameter angegeben werden.
class Bruch
{
//...
const Bruch operator + (const Bruch &b2);
//...
}
als globale Funktion
[Bearbeiten]Wird der Operator als globale Funktion implementiert, müssen beide Operanden als Parameter angegeben werden.
Bruch operator + (Bruch b1, Bruch b2);
Dies ist notwendig, wenn der Typ des ersten Operanden ungleich der jeweiligen Klasse sein soll:
einBruch + 1 // Implementierung als Member-Funktion möglich
1 + einBruch // Implementierung als Member-Funktion nicht möglich
Besonderheiten einzelner Operatoren
[Bearbeiten]Zuweisungsoperatoren
[Bearbeiten]Zuweisungsoperatoren müssen (bzw. sollen) den Wert der Zuweisung zurückgeben, damit Mehrfachzuweisungen (a = b = c;) möglich sind.
->-Operator
[Bearbeiten]Der ->-Operator muss entweder einen Zeiger auf ein Objekt zurückgeben, oder ein Objekt, für das der ->-Operator ebenfalls überladen ist.
Operatoren zum expliziten Casting
[Bearbeiten]Es ist nicht möglich den Operator zum expliziten Casting () selbst zu überladen. Stattdessen wird der Operator für den Zieldatentyp implementiert. Die Operator-Überladung (als Member-Funktion)
operator float ();
würde folgendes Casting ermöglichen:
(float)einBruch
Präfix- und Postfix-Inkrement bzw. Dekrement
[Bearbeiten]Die Präfix-Version von ++ und -- läst sich wie alle anderen Operatoren überladen. In der Postfix-Version übergibt man einen int als Parameter, welcher nur als Signal für den Compiler dient und ansonsten völlig ignoriert wird.