2013-07-29 7 views
5

Ich habe gerade diese Syntax für einen Funktionsprototyp in C++ gesehen:Was bedeutet es, wenn einem Parameter ein Wert im Funktionsprototyp zugewiesen wird?

explicit String(unsigned char value, unsigned char base=10);

ich das vorher noch nicht gesehen, aber bin ich richtig in der Annahme, es base-10 unabhängig davon, was setzt man es nennen mit?

+0

@EdKing Sie sagten explizit in der Frage und verwirrt uns – doctorlove

+1

Mein schlechtes - Ich habe den Fragetitel geändert :-) –

+0

So hat 'Explizit' nichts mit irgendetwas hier zu tun? –

Antwort

4

Der Standardparameter, die so genannte base wird nehmen, was Wert, den Sie es senden, oder der Wert 10, wenn Sie es weglassen, z.B. durch den Aufruf

String(0); 

Vorausgesetzt, dass Sie es mit nur einem Parameter nennen kann, da die zweite vorbelegt werden kann, kann ein Konstruktor als explicit markiert werden. Dies bedeutet, dass es keine temporäre von einem unsigned char erstellen wird, ohne dass Sie bemerken, dass Sie den Konstruktor explizit aufrufen müssen.

+0

AFAIR, Konstruktoren mit mehr als einem Parameter können auch als explizit deklariert werden, um Initialisiererlistenkonvertierungen zu verhindern? – nijansen

+0

Guter Punkt - Ich habe nicht daran gedacht – doctorlove

0

Sehen Sie diese link:

Wenn Sie eine Funktion deklarieren wir einen Standardwert für jede die letzten Parameter angeben können. Dieser Wert wird verwendet, wenn das entsprechende Argument beim Aufruf der Funktion leer bleibt. Dazu müssen wir einfach den Zuweisungsoperator und einen Wert für die Argumente in der Funktionsdeklaration verwenden. Wenn beim Aufruf der Funktion ein Wert für diesen Parameter nicht übergeben wird, wird der Standardwert verwendet. Wenn jedoch ein Wert angegeben wird, wird dieser Standardwert ignoriert und stattdessen der übergebene Wert verwendet.

Das Schlüsselwort explicit verhindert impliziten Konvertierungen:

C++ ctors (Konstruktoren), die nur einen Parameter automatisch implizite Typkonvertierung durchzuführen. Übergeben Sie zum Beispiel einen Int, wenn der Ctor einen String-Zeiger-Parameter erwartet, fügt der Compiler den -Code hinzu, den es haben muss, um den Int in einen Zeichenfolgenzeiger zu konvertieren. Dieses automatische Verhalten kann jedoch Fehler verursachen.

+2

Perfekt. Danke - schnell und schmerzlos. –

+1

@serial downvoter, ein Leben bekommen. – Maroun

1

base hat einen Standardwert. Sie können für jeden Parameter einen Standardwert vergeben, da alle folgenden Parameter ebenfalls Standardwerte haben.

explicit verhindert implizite Konvertierungen, so String k = 0 wird nicht als gültig akzeptiert werden - es String(0, 10) anders nennen würde.

Verwandte Themen