Konvertierungs-Operatoren

Grundsätzlich besteht die Möglichkeit von einer Klasse in eine andere zu konvertierten indem man die Klassen mit entsprechenden Konstruktoren ausrüstet. So könnte man in unserer Beispielklasse 'Fraction' einen Konstruktor schreiben, der eine Fließkommazahl in einen gleichwertigen Bruch umwandelt. (Über Rundungsfehler sei hier einmal hinwegzusehen).

Leider besteht aber nicht immer die Möglichkeit, Klassen um entsprechende Konstruktoren zu erweitern. Zum Einen hat man nicht immer den Sourcecode, zum Anderen sind nicht alle Datentypen Klassen. Wir sehen das an folgendem Beispiel:

Fraction f( 1, 2 );
double m;
 
m = f;

Wir können double keinen neuen Operator mitgeben, deswegen müssen wir unserer Klasse Fraction mitteilen, wie sie sich zu einem double umwandeln kann. Dafür definieren wir einen Konvertierungsoperator:

class Fraction
{
  ...
    inline operator double( void )
    {
      return ((double) Numerator) / Denominator;
    }
}

Und das wars auch schon. Wann immer ein Fraction als double gelesen werden muss, wird dieser Operator aufgefunden. Zu beachten ist hier, dass dem operator kein Rückgabetyp gegeben wird, er ist also - wie der Konstruktor - ohne Datentyp. Auch wenn dies in gewisser Weise inkonsistent zur Syntax von Funktionen und Operatoren ist, so gibt die Schreibweise den Typ bereits mit der Bezeichnung des Operators vor: double.

Um den Aufruf deutlicher zu kennzeichnen, kann er auch explizit aufgerufen werden:

Fraction f( 1, 2 );
double m;
 
m = double( f );

Man kann die Umwandlung allerdings nicht als explizit fordern. Der GNU C++ Compiler akzeptiert explizit hier nicht.

Weiterhin dürfen Konvertierungsoperatoren nicht statisch sein, das heißt sie müssen als (nicht statische) Memberfunktionen der Klasse definiert werden und können nicht global definiert werden.

Selbstverständlich ist es nicht notwendig den Operator inline zu definieren, man kann die Definition natürlich auch im Code-File vornehmen. Er darf lediglich nicht statisch deklariert werden:

class Fraction
{
  ...
    operator double( void );
};
 
Fraction::operator double( void )
{
  return ((double)Numerator) / Denominator;
}