Was ist ein Konvertierungskonstruktor in C ++? Wofür ist das?
Ich habe gehört, dass C++ so genannte "conversion-Konstrukteure" oder "konvertieren von Konstruktoren". Was sind diese, und was sind Sie? Ich sah es erwähnt mit Bezug auf diesen code:
class MyClass
{
public:
int a, b;
MyClass( int i ) {}
}
int main()
{
MyClass M = 1 ;
}
InformationsquelleAutor der Frage octoback | 2013-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die definition für eine Konvertierung Konstruktor ist der Unterschied zwischen C++03 und C++11. In beiden Fällen muss es eine nicht-
explicit
Konstruktor (sonst wäre es ja nicht eingebunden in implizite Konvertierungen), aber für C++03, muss es auch aufrufbar sein, mit einem einzigen argument. Das heißt:Konstruktoren 1 und 2 sind die Konvertierung in beide Konstruktoren in C++03 und C++11. Konstruktor 3, die müssen zwei Argumente, ist nur eine Konvertierung Konstruktor in C++11. Das Letzte, Konstruktor 4, ist keine Konvertierung Konstruktor, weil es
explicit
.C++03: §12.3.1
C++11: §12.3.1
Warum sind Konstruktoren mit mehr als einem parameter betrachtet werden, die Umwandlung von Konstruktoren in C++11? Das ist, weil die neue Norm bietet uns einige nützliche syntax für die übergabe von Argumenten und Rückgabe von Werten mit verspannt-init-Listen. Betrachten Sie das folgende Beispiel:
Die Fähigkeit zu geben den Rückgabewert als einen verspannt-init-Liste ist als ein Umbau. Diese verwendet die Konvertierung Konstruktor für
foo
nimmtfloat
und einint
. Darüber hinaus können wir diese Funktion aufrufen, indem Sie tunbar({2.5f, 10})
. Dies ist auch eine Umwandlung. Da Sie Konvertierungen, macht es Sinn, für die Konstruktoren, die Sie verwenden werden Umwandlung von Konstruktoren.Es ist wichtig zu beachten, daher, dass der Konstruktor von
foo
die einefloat
und einint
haben dieexplicit
Funktion Planer aufhören würde den obigen code kompilieren. Die oben genannten neuen syntax kann nur verwendet werden, wenn es eine Konvertierung Konstruktor zur Verfügung, um die Arbeit zu tun.C++11: §6.6.3:
§8.5:
§12.3.1:
InformationsquelleAutor der Antwort Joseph Mansfield
Konvertierung implizit mit der Konvertierung Konstruktor
Lassen Sie uns das Beispiel in der Frage komplexer
Beiden ersten Konstruktoren sind Umwandlung von Konstruktoren. Der Dritte ist ein copy-Konstruktor, und als solches ist es ein anderes konvertieren Konstruktor.
Einer Konvertierung Konstruktor ermöglicht implizite Konvertierung vom argument-Typ an den Konstruktor geben. Hier der erste Konstruktor ermöglicht die Konvertierung von einem
int
auf ein Objekt der KlasseMyClass
. Zweite Konstruktor ermöglicht die Konvertierung von einem string in ein Objekt der KlasseMyClass
. Und die Dritte... von einem Objekt der KlasseMyClass
auf ein Objekt der KlasseMyClass
!Ein-converting-Konstruktor, Konstruktor muss haben einzelnen argument (in der zweiten, die zweite argument hat einen default-Wert) und erklärt werden, ohne zu Stichwort
explicit
.Dann die Initialisierung in der main kann wie folgt Aussehen:
Explicit-Schlüsselwort und Konstruktoren
Nun, was, wenn wir verwendet hatten, die
explicit
keyword ?Dann, compiler akzeptieren würde, der nicht
da dies eine implizite Konvertierung. Stattdessen schreiben
explicit
Schlüsselwort ist immer verwendet werden, um zu verhindern, dass eine implizite Konvertierung für einen Konstruktor und es gilt Konstruktor in eine Klasse Erklärung.InformationsquelleAutor der Antwort octoback