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
BearbeitenArithmetische Operatoren
Bearbeiten+ - * / %
Inkrement, Dekrement
Bearbeiten++ --
Vergleichsoperatoren
Bearbeiten== != < > <= >=
Logische Operatoren
Bearbeiten&& || !
Zuweisungsoperatoren
Bearbeiten= += -= *= /= %= &= |= ^= ~= <<= >>=
Bitoperatoren
Bearbeiten& | ^ ~ << >>
Funktionsaufruf, Indexoperator
Bearbeiten() []
Sonstige Operatoren
Bearbeiten& * -> , new delete
Implementierungsarten
Bearbeitenals Member-Funktion
BearbeitenWird 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
BearbeitenWird 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
BearbeitenZuweisungsoperatoren
BearbeitenZuweisungsoperatoren müssen (bzw. sollen) den Wert der Zuweisung zurückgeben, damit Mehrfachzuweisungen (a = b = c;) möglich sind.
->-Operator
BearbeitenDer ->-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
BearbeitenEs 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
BearbeitenDie 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.