explizit (C++)
C++-Konstruktoren, die derzeit einen Parameter automatisch die implizite Typkonvertierung ausführen lassen.Wenn Sie beispielsweise int führen, wenn der Konstruktor einen Zeichenfolgenzeiger Parameter erwartet, fügt der Compiler den Code hinzu, int Konvertieren in einen Zeichenfolgenzeiger erforderlich sind.Sie sollten jedoch nicht immer dieses automatische Verhalten.
Sie können explicit der Konstruktordeklaration hinzufügen, um implizite Konvertierungen zu verhindern.Dies zwingt den Code ein Parameter mit dem richtigen Typ oder wandelte den Parameter in den richtigen Typ um.Das heißt, wenn die Umwandlung nicht in Code ausgedrückt wird, ergibt sich ein Fehler aufgetreten.
Das explicit-Schlüsselwort kann die angewendeten In Klasse nur Deklarationen Konstruktor eines Objekts sein, um explizit zu erstellen.
Beispiel
Das folgende Programm zum Kompilieren erzeugt einen Fehler.Der Code versucht, eine implizite Konvertierung auszuführen, aber explicitVerwendung des Schlüsselworts hat zur Folge, dass es.Um den Fehler zu beheben, entfernen Sie die explicit Schlüsselwörter und passen Sie den Code in g.
// spec1_explicit.cpp
// compile with: /EHsc
#include <stdio.h>
class C
{
public:
int i;
explicit C(const C&) // an explicit copy constructor
{
printf_s("\nin the copy constructor");
}
explicit C(int i ) // an explicit constructor
{
printf_s("\nin the constructor");
}
C()
{
i = 0;
}
};
class C2
{
public:
int i;
explicit C2(int i ) // an explicit constructor
{
}
};
C f(C c)
{ // C2558
c.i = 2;
return c; // first call to copy constructor
}
void f2(C2)
{
}
void g(int i)
{
f2(i); // C2558
// try the following line instead
// f2(C2(i));
}
int main()
{
C c, d;
d = f(c); // c is copied
}
Das Deklarieren eines Konstruktors, der die mehrere Argumente enthält, die explicit ist, hat keine Auswirkungen, da diese Konstruktoren nicht an den impliziten Konvertierungen teilnehmen können.Allerdings verfügt explicit Auswirkungen, wenn ein Konstruktor mehrere Argumente und alle verfügt, mit Ausnahme eines der Argumente über einen Standardwert verfügt.