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

WANDLUNGEN ÜBER KONSTRUKTOR ODER OPERATORFUNKTION?
 
&&

Wir haben gesehen, dass eine implizite Konvertierung von A nach B auf zwei Wegen erreicht werden kann:

q  durch einen Konstruktor in B, der mit einem Argument aufgerufen wer­den kann,oder

q  durch eine Operatorfunktion in A.

Daraus ergibt sich für die Praxis die Frage, in welcher Form eine ge­wünschte Konvertierungsmöglichkeit implementiert werden soll.

&   Konvertierung über Konstruktor

Die Lösung über einen Konstruktor in B hat folgende Eigenschaften:

q  Die Wandlungsfunktion ist ein Mitglied der Klasse B.

q  Auf die A-Objekte wird nur lesend zugegriffen. Der entsprechende Kon­struktor wird deshalb im allgemeinen als

      

B( const A& );

      

     deklariert.

q  Auf das B-Objekt wird schreibend zugegriffen. Der Konstruktor ist eine Mitgliedsfunktion von B und deshalb für diese Aufgabe das rich­tige Mittel.

qB muss eine Klasse sein und darüber hinaus durch den Programmie­rer verändert werden können. in der Praxis bedeutet das, dass der Quellcode verfügbar und die Klasse übersetzbar sein müssen.

qIn bestimmten Situationen kommt die Wandlung ohne temporäres Objekt aus, wie z.B. bei einer Initialisierung:

 

A a;

B b1 = a;        // kein temporäres Objekt erforderlich

B b2( a );       // dito

 

Aus diesen Gründen ist die Konvertierung über einen Konstruktor im Zieldatentyp meist die erste Wahl.

&   Konvertierung über Operatorfunktion

Die Lösung über eine Operatorfunktion in A hat folgende Eigen­schaften:

q  Die Wandlungsfunktion ist ein Mitglied der Klasse A.

q  Der Operator muss ein B-Objekt oder eine Referenz auf ein B-Ob­jekt zu­rückliefern.

q  Das Quellobjekt bleibt unverändert. Der Operator wird deshalb nor­ma­lerweise als konstante Mitgliedsfunktion deklariert:

      

B operator B() const;

 

qDer Typ A muss eine Klasse sein und darüber hinaus durch den Pro­grammierer verändert werden können.

 

Die Konvertierung über eine Operatorfunktion im Quelldatentyp ist nur die zweite Wahl, vor allem weil meist trotzdem ein Konstruktor des Zieldatentyps verwendet werden muss. Sie muss jedoch dann an­gewendet werden, wenn die Konvertierung über einen Konstruktor nicht möglich ist. Dafür gibt es im Wesentlichen drei Gründe:

q  Der Zieldatentyp ist keine Klasse. Eine Konvertierung zu einem einfa­chen Datentypen wie z.B. int oder char* ist nur über Ope­ratorfunktion möglich, da die einfachen Datentypen nicht mit ei­nem (zusätzlichen) Konstruktor ausgerüstet werden können.

q  Der Zieldatentyp ist zwar eine Klasse, diese soll oder kann jedoch nicht verändert werden - z.B. weil bei einer zugekauften Biblio­thek der Quell­code nicht verfügbar ist.

q  Vom Programmdesign her ist es nicht sinnvoll, die Wandlung im Zielda­tentyp vorzunehmen.

 




Benutzerdefinierte Wandlungen | Mehrstufige Wandlungen