Sie sind hier: Buchauszüge Typwandlungen  
 BUCHAUSZÜGE
Vorwort
Inhaltsverzeichnis
Einführung
Typwandlungen

TYPWANDLUNG UND SYMMETRISCHE OPERATOREN
 
&&

In Kapitel 22 (Operatorfunktionen) haben wir den Additionsoperator für Complex-Objekte ver­suchsweise als Mitgliedsfunktion von Complex deklariert[1]:

 

 

class Complex

{

public:

  Complex( double re_in, double im_in = 0.0 )

  Complex operator + ( const Complex& );

 

  /* ... weitere Mitglieder ... */

 

};

 

Schreibt man nun z.B.

 

Complex c2, c3;

 

c3 = c2 + 1.0;             // implizite Konvertierung zu Complex

 

erfolgt wie erwartet eine implizite Konvertierung des double-Wertes 1.0 zu einem temporären Complex-Objekt, das dann als Argument für den Additionsoperator verwendet wird.

 

Übung 24-10:

Ist die Anweisung

 

c3 = c2 + 1;                      // ???

 

ebenfalls zulässig?

 

Diese implizite Konvertierung funktioniert nur für die rechte Seite in der An­weisung. Schreibt man dagegen

 

c3 = 1.0 + c2;      // Fehler! keine implizite Konvertierung zu Complex

 

erhält man einen Syntaxfehler. Der Grund ist, dass die Notation

 

z = x + y;

 

der Notation

 

z = x.operator + ( y );

 

entspricht, wenn die Operatorfunktion als Mitgliedsfunktion imple­mentiert ist. Der Typ double ist jedoch keine Klasse und hat daher auch keine Mitgliedsfunktionen. 

Um implizite Konvertierungen auch für die linke Seite eines Opera­torausdrucks möglich zu machen, muss der Operator mit Hilfe einer globalen Operatorfunktion implementiert werden:

 

 

Complex operator + ( const Complex&, const Complex& );

Nun können implizite Konvertierungen für beide Parameter erfolgen, die Anweisung

 

c3 = 1.0 + c2;      // nun auch hier implizite Konvertierung zu Complex

 

ist nun syntaktisch korrekt.

Es ist also günstiger, den Operator + über eine globale Operatorfunk­tion zu imple­men­tieren. Das gleiche gilt für alle symmetrischen Ope­ratoren wie *, ==, != etc. Alle diese Operatoren ändern außerdem keines der Argumente, son­dern geben das Ergebnis in einem (neuen) Objekt zurück.

Im Gegensatz dazu stehen die Operatoren, die auf ein Objekt wirken und die­ses verändern. Zu ihnen gehören z.B. die erweiterten Zuwei­sungsopera­toren (+=, -= etc), sowie Inkrement- und Dekrementope­rator (++ bzw. --). Diese Opera­toren werden deshalb grundsätzlich als Klassenmitglieder implementiert.

 



[1]      Seite 489




Mehrstufige Wandlungen | Einige Häufige Typwandlungen