explicit

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