Was bedeutet das explizite Keyword?
Was bedeutet die explicit
Stichwort bedeutet in C++?
Kommentar zu dem Problem
Ich möchte nur darauf hinweisen, um jemand neues kommt, dass seit C++11,
explicit
angewendet werden können, um mehr als nur Konstruktoren. Es ist nun gültig, wenn angewandt, um die conversion-Operatoren. Angenommen, Sie haben eine Klasse BigInt
mit einem conversion operator int
und eine explizite Konvertierung operator std::string
aus welchem Grund auch immer. Sie werden in der Lage sein zu sagen, int i = myBigInt;
, aber du musst cast explizit (mit static_cast
, vorzugsweise), um zu sagen, , std::string s = myBigInt;
. Kann nicht expliziten verweisen auch auf Auftrag? (z.B.
int x(5);
) InformationsquelleAutor der Frage Skizz | 2008-09-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der compiler darf eine implizite Konvertierung zu beheben, die Parameter an eine Funktion. Was dies bedeutet ist, dass der compiler kann mit Hilfe von Konstruktoren callable mit einem einzelnen parameter konvertieren von einem Datentyp in einen anderen um, um den richtigen Typ für einen parameter.
Hier ist eine Beispiel-Klasse mit einem Konstruktor, der verwendet werden kann für implizite Konvertierungen:
Hier ist eine einfache Funktion, die eine
Foo
Objekt:und hier ist, wo die
DoBar
- Funktion aufgerufen wird.Das kein argument ist
Foo
Objekt, sondern einint
. Allerdings gibt es einen Konstruktor fürFoo
braucht man einint
damit dieser Konstruktor kann verwendet werden, konvertieren Sie die parameter mit dem richtigen Typ.Der compiler darf diese einmal für jeden parameter.
Indem der
explicit
Schlüsselwort der Konstruktor verhindert, dass der compiler von der Verwendung des Konstruktors für implizite Konvertierungen. Hinzufügen der obigen Klasse erstellen einen compiler-Fehler bei Aufruf der FunktionDoBar (42)
. Es ist nun notwendig zu nennen, die für die Konvertierung explizit mitDoBar (Foo (42))
Der Grund möchten Sie vielleicht, dies zu tun ist, um versehentliche Konstruktion, die bugs verstecken können. Erfundenes Beispiel:
MyString(int size)
Klasse mit einem Konstruktor, erstellt einen string der angegebenen Größe. Sie haben eine Funktionprint(const MyString&)
, und Sie rufenprint(3)
(wenn Sie eigentlich soll callprint("3")
). Sie erwarten, dass es zu drucken, "3", aber es gibt einen leeren string der Länge 3 statt.InformationsquelleAutor der Antwort
Nehme an, Sie haben eine Klasse
String
:Wenn man jetzt versucht:
Den Charakter
'x'
werden implizit inint
und dann dieString(int)
Konstruktor aufgerufen wird. Aber, das ist nicht das, was der Benutzer haben soll. So, um zu verhindern, dass solche Bedingungen, wir definieren Sie den Konstruktor wieexplicit
:InformationsquelleAutor der Antwort Eddie
In C++ einen Konstruktor mit nur einer der erforderlichen parameter als eine implizite Konvertierung-Funktion. Er wandelt den Typ des Parameters für die Klasse geben. Ob dies eine gute Sache ist oder nicht, hängt von der Semantik des Konstruktors.
Zum Beispiel, wenn Sie eine string-Klasse mit Konstruktor
String(const char* s)
, das ist wahrscheinlich genau das, was Sie wollen. Können Sie einconst char*
zu einer Funktion erwartet einenString
, und der compiler wird automatisch konstruieren Sie eine temporäreString
Objekt für Sie.Auf der anderen Seite, wenn Sie eine buffer-Klasse, deren Konstruktor
Buffer(int size)
nimmt die Größe des Puffers in Byte, die Sie wahrscheinlich nicht wollen, dass der compiler leise drehenint
s inBuffer
s. Um das zu verhindern, erklären Sie den Konstruktor mit derexplicit
Stichwort:So,
wird ein compile-time-Fehler. Wenn Sie wollen, eine temporäre
Buffer
Objekt, Sie haben dazu ausdrücklich:In Zusammenfassung, wenn Sie Ihr single-parameter-Konstruktor wandelt den parameter in ein Objekt der Klasse, die Sie wahrscheinlich nicht wollen, verwenden Sie die
explicit
Schlüsselwort. Aber wenn Sie einen Konstruktor, der einfach passiert, um einen einzelnen parameter, sollten Sie deklarieren es alsexplicit
um zu verhindern, dass der compiler aus überrascht Sie mit unerwarteten Wandlungen.InformationsquelleAutor der Antwort cjm
Diese Antwort ist über die Objekt-Erstellung mit/ohne expliziten Konstruktor, da es nicht in den anderen Antworten.
Betrachten Sie die folgende Klasse ohne expliziten Konstruktor:
Objekte der Klasse Foo erzeugt werden können, 2 Möglichkeiten:
Je nach Umsetzung, die zweite Art der Instanziierung der Klasse Foo kann verwirrend sein, oder nicht das, was der Programmierer beabsichtigt hat. Indem der
explicit
Schlüsselwort der Konstruktor erzeugt einen compiler-Fehler, beiFoo bar2 = 20;
.Ist es in der Regel gute Praxis zu erklären, single-argument-Konstruktoren als
explicit
, es sei denn, Ihre Umsetzung insbesondere verbietet es.Beachten Sie auch, dass Konstruktoren mit
genutzt werden können als Einzel-argument Konstruktoren. So möchten Sie vielleicht, um diese auch
explicit
.Beispiel, wenn Sie würde absichtlich nicht wollen Ihr single-argument-Konstruktor explicit ist, wenn Sie erstellen einen Funktor (Blick auf die 'add_x' struct deklariert diese Antwort). In einem solchen Fall erstellen Sie ein Objekt als
add_x add30 = 30;
würde wohl Sinn machen.Hier ist eine gute schreiben-bis auf explizite Konstruktoren.
InformationsquelleAutor der Antwort Gautam
Den
explicit
Schlüsselwort macht eine Konvertierung Konstruktor nicht-Konvertierungs-Konstruktor. Als ein Ergebnis, der code ist weniger fehleranfällig.InformationsquelleAutor der Antwort SankararaoMajji
Das Schlüsselwort
explicit
begleitet entwederÜbersicht
Explizite Konvertierung Funktionen und Konstruktoren können nur verwendet werden, für die Sie explizite Umwandlungen (direkte Initialisierung oder der explizite cast-operation), während nicht-explizite Konstruktoren und Konvertierungsfunktionen können verwendet werden, für die implizite als auch die explizite Konvertierungen.
Beispiel mit Strukturen
X, Y, Z
und Funktionenfoo, bar, baz
:Let ' s Blick auf eine kleine setup von Strukturen und Funktionen zu sehen, der Unterschied zwischen
explicit
- und nicht -explicit
Konvertierungen.Beispiele über Konstruktor:
Umwandlung einer Funktion argument:
Objekt-Initialisierung:
Beispiele bezüglich der Konvertierung Funktionen:
Umwandlung einer Funktion argument:
Objekt-Initialisierung:
Warum
explicit
Konvertierungs-Funktionen oder Konstruktoren?Konvertierungs-Konstruktoren und nicht-explizite Konvertierung-Funktionen möglicherweise nicht mehr eindeutig.
Betrachten eine Struktur
V
, umbaubar zumint
eine StrukturU
implizit baubar ausV
und eine Funktionf
überlastetU
undbool
bzw.Einen Anruf zu
f
ist mehrdeutig, wenn Sie ein Objekt vom TypV
.Der compiler nicht wissen, ob die Verwendung der Konstruktor von
U
oder die umwandlungsfunktion konvertieren Sie dieV
Objekt in einen Typ für das bestehen derf
.Wenn entweder der Konstruktor der
U
oder die Umwandlung vonV
wäreexplicit
würde, gäbe es keine Mehrdeutigkeit, da nur die nicht-explizite Konvertierung betrachtet werden würde. Wenn die beiden expliziten Aufruff
mit einem Objekt vom TypV
würde durchgeführt werden müssen, um eine explizite Konvertierung oder cast-operation.Konvertierungs-Konstruktoren und nicht-explizite Konvertierung-Funktionen kann es zu unerwarteten Ergebnissen kommen.
Betrachten eine Funktion Druck ein Vektor:
Wenn die Größe-Konstruktor des Vektors würde nicht eindeutig sein, es wäre möglich, rufen Sie die Funktion wie folgt:
Was würde man erwarten von einem solchen Anruf? Eine Zeile, die
3
oder drei Zeilen mit0
? (Wo das zweite ist, was passiert.)Verwenden des explicit-Schlüsselwort in einer Klasse interface erzwingt die Benutzer der Schnittstelle, die explizit über die gewünschte Konvertierung aus.
Als Bjarne Stroustrup es ausdrückt (in "Die C++ Programmiersprache", 4. Ed., 35.2.1, S. 1011) auf die Frage, warum
std::duration
nicht implizit konstruiert aus einer einfachen Zahl:InformationsquelleAutor der Antwort Pixelchemist
Den
explicit
-Schlüsselwort kann verwendet werden, um zu erzwingen, wird ein Konstruktor aufgerufen werden explizit.den
explicit
-Schlüsselwort vor dem KonstruktorC(void)
sagt dem compiler, dass nur explizite Aufruf dieser Konstruktor erlaubt ist.Den
explicit
-Schlüsselwort kann auch verwendet werden, in benutzerdefinierten type-cast-Operatoren:Hier
explicit
-Schlüsselwort erzwingt nur explizite Typumwandlungen, um gültig zu sein, sobool b = c;
wäre eine ungültige cast in diesem Fall. In Situationen wie diesenexplicit
-Schlüsselwort können helfen Programmierer zu vermeiden, implizit, unbeabsichtigt wirft. Diese Nutzung wurde standardisiert in C++11.InformationsquelleAutor der Antwort Helixirr
Wurde dies bereits diskutiert (was ist explicit-Konstruktor). Aber ich muss sagen, es fehlen die detaillierten Beschreibungen finden Sie hier.
Außerdem ist es immer eine gute Codierung der Praxis, um Ihr ein argument Konstruktoren (einschließlich jene, die mit Standard-Werten für arg2,arg3,...) wie schon gesagt.
Wie immer mit C++: wenn man nicht will, wirst du dir wünschen du hast...
Noch eine gute übung für die Klassen ist, um Kopie-Konstruktion und Zuweisung von privaten (ein.k.ein. deaktivieren Sie es), es sei denn, Sie wirklich brauchen, um es zu implementieren. Dies verhindert, dass allfällige Kopien der Zeiger bei Verwendung der Methoden, die in C++ wird für Sie standardmäßig. Ein anderer Weg, dies zu tun ist eine Ableitung von boost::noncopyable.
InformationsquelleAutor der Antwort fmuecke
Cpp Referenz ist immer hilfreich!!! Details zu expliziten Bezeichner gefunden werden kann hier. Möglicherweise müssen Sie schauen, implizite Konvertierungen und copy-Initialisierung zu.
Kurzer Blick
Beispiel wie folgt:
InformationsquelleAutor der Antwort selfboot
Explizite Konvertierungs-Konstruktoren (nur C++)
Den folgenden Deklarationen sind zulässig:
Die erste Deklaration ist äquivalent zu
A c = A( 1 );
.Wenn Sie deklarieren, wird der Konstruktor der Klasse als
explicit
die früheren Erklärungen wäre illegal.Zum Beispiel, wenn Sie die Klasse deklarieren:
Können Sie nur Werte zuweisen, die den Werten entsprechen, die von der Klasse geben.
Beispielsweise die folgenden Anweisungen sind zulässig:
InformationsquelleAutor der Antwort coding_ninza
Konstruktoren Anhängen implizite Konvertierung. Zum unterdrücken dieses implizite Konvertierung ist es erforderlich, zu deklarieren eines Konstruktors mit einem parameter explizit.
In C++11 können Sie auch angeben, einen "operator Typ()" mit einer solchen keyword - http://en.cppreference.com/w/cpp/language/explicit Mit einer solchen Angabe, die Sie verwenden können Betreiber in Bezug auf die explizite Konvertierungen und die direkte Initialisierung des Objekts.
P. S. Bei der Verwendung von Transformationen, die VOM BENUTZER definiert (über Konstruktoren und Typ-Konvertierung-operator) es darf nur eine Ebene der impliziten Konvertierungen verwendet.
Aber Sie können kombinieren, diese Konvertierungen mit der anderen Sprache Konvertierungen
InformationsquelleAutor der Antwort bruziuz