C++-Programmierung: Operator-Überladung

Alte Seite
Diese Seite gehört zum alten Teil des Buches und wird nicht mehr gewartet. Die Inhalte sollen in das neue Buch einfließen: C++-Programmierung/ Inhaltsverzeichnis.
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.