Normalerweise bemüht sich der Compiler, bei Funktionsaufrufen mit einer gegebenen Parameterliste eine möglichst passende Funktion zu finden. Wenn es keine Funktion mit einer exakt passenden Signatur gibt, dann werden alle in Frage kommenden überladenen Funktionen betrachtet, und versucht mit einer Reihe einfacher Typkonversionen (char zu int und umgekehrt, int zu long und umgekehrt, int zu double und so weiter) eine passende Auswahl zu treffen. Wenn diese Auswahl zu genau einer der überladenen Funktionen führt, dann wird diese genommen, ansonsten wird eine Fehlermeldung ausgegeben.
Mit Methoden und auch mit Konstruktoren wird normalerweise ebenso verfahren.
Gerade bei Konstruktoren kann diese automatische Konversion aber
unerwünscht sein. Beispielsweise kann ein fiktiver Typ
meinstring mit einer ganzen Zahl
initialisiert werden; dies gibt dann die anfängliche Anzahl von
(Leer-)Zeichen an; mit einem anderen String oder einer
const char*
-Konstante dagegen gibt man den anfänglichen Inhalt vor:
meinstring s1( 10 ); // 10 Leerzeichen
meinstring s2( "abc" ); // 3 Zeichen: 'a', 'b', 'c'
Weitere Konstruktoren sollen nicht existieren; insbesondere ein
Konstruktor, der ein char entgegen nimmt, soll nicht vorhanden sein.
Ein Benutzer könnte jetzt (ohne vorher genau in seinen Unterlagen zu
lesen) versuchen, ein meinstring-Objekt mit einem char zu
initialisieren:
meinstring s1( 'a' ); // gewünscht: ein Zeichen a
Die Vorstellung, damit einen String mit einem a erzeugt zu
haben, ist aber Illusion: weil kein Konstruktor mit einem
char-Parameter existiert, ist derjenige mit einem
int-Parameter für den Compiler so verlockend und eindeutig, daß
der Wert 'a'
in eine int konvertiert wird (auf einem
Rechner mit ASCII-Zeichensatz ergibt das den Wert 97), und es wird ein
String meinstring( 97 ) erzeugt!
Um solche subtilen Fehler zu vermeiden, kann man beim Erstellen der Klasse mit explicit ausdrücken, daß der jeweilige Konstruktor nur mit exakt passenden Parametern aufgerufen werden darf, und ein implizites Konvertieren nicht erfolgen soll:
class meinstring { // ... explicit meinstring( int anzahl ); meinstring( const char *initstr ); // ... }
So wird der Anwender gezwungen, einen Konstruktor mit genau passender
Signatur zu verwenden, wenn er meinstring( int anzahl )
aufgerufen haben möchte.
AnyWare@Wachtler.de