Umwandlungs-Operator: Problematik der Mehrdeutgikeit (2/2)
Dieser kann nämlich auf zwei Arten interpretiert werden:
Zum einen als
x < Bruch(1000)
oder aber -- da eine Konvertierungsfunktion zum Typ double
existiert
-- als
(double)x < (double)1000.
-
Beide Interpretationen sind möglich und gleichwertig! Dies liegt daran,
daß jede Interpretation über selbstdefinierte Konvertierungen
(über Konstruktoren oder Konvertierungsfunktionen) die gleiche Priorität
besitzt.
-
Der obige Ausdruck ist somit mehrdeutig. Es gibt zwar genaue
(Prioritäts-)Regeln
zur automatischen Typumwandlung, d.h. der Compiler kann dieses Problem
schon eindeutig lösen. Da diese Regeln aber alles andere als trivial
sind, ist es für den Programmierer nicht unbedingt klar, in welchem
Sinne der Ausdruck interpretiert und ausgewertet wird -- mit eventuell
ungeahnten Folgen für den weiteren Programmablauf!
Dieses Beispiel sollte eines deutlich machen:
-
Man sollte automatische Typumwandlungen nicht wahllos deklarieren, sondern
eher vermeiden, wo immer es nur geht!
Das bedeutet vor allem, daß es zu einem Konstruktor, der mit nur
einem Argument aufrufbar ist, keine Konvertierungsfunktion geben sollte,
die genau die entgegengesetzte Umwandlung vornimmt. Genauso sollte darauf
geachtet werden, daß zwei verschiedene Klassen nicht eben Konstruktoren für
Objekte der jeweils anderen Klasse definieren. Beachtet man diese kleinen Regeln, so kann
die Mehrdeutigkeitsproblematik aufgelöst werden. Eine sicherere Lösung wird
auf der folgenden Seite aufgezeigt.