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 werden
kann,oder
q durch eine Operatorfunktion in A.
Daraus ergibt sich für die Praxis die Frage, in welcher Form eine gewünschte
Konvertierungsmöglichkeit implementiert werden soll.
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 Konstruktor 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 richtige Mittel.
qB muss eine Klasse sein und darüber hinaus durch den Programmierer
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.
Die Lösung über eine Operatorfunktion in A hat folgende Eigenschaften:
q Die Wandlungsfunktion ist ein Mitglied der Klasse
A.
q Der Operator muss ein B-Objekt oder eine Referenz
auf ein B-Objekt
zurückliefern.
q Das Quellobjekt bleibt unverändert. Der
Operator wird deshalb normalerweise als konstante Mitgliedsfunktion deklariert:
B operator B() const;
qDer Typ A
muss eine Klasse sein und darüber hinaus durch den Programmierer 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 angewendet
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 einfachen Datentypen wie z.B. int oder char* ist nur über Operatorfunktion möglich,
da die einfachen Datentypen nicht mit einem (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
Bibliothek der Quellcode nicht verfügbar ist.
q Vom Programmdesign her ist es nicht sinnvoll,
die Wandlung im Zieldatentyp vorzunehmen.