C++ Konstruktor-syntax
Einfache Frage: sind die folgenden Aussagen äquivalent? oder ist das zweite eine tun mehr implizite Dinge hinter den kulissen (wenn ja, was?)
myClass x(3);
myClass x = myClass(3);
Dank!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sind Sie nicht ganz identisch sind. Die erste heißt "direct initialization", während der zweite heißt "copy initialization".
Nun, der Standard macht zwei Regeln. Die erste ist für die direkte Initialisierung und für die Kopie der Initialisierung, wo die Initialisierung ist der Typ der das Objekt initialisiert. Die zweite Regel ist für die Kopie der Initialisierung in anderen Fällen.
Also, von diesem Gesichtspunkt aus sind beide als in - der - first- Regel. In dem Fall, wo Sie haben, kopieren Sie die Initialisierung mit dem gleichen Typ, den der compiler erlaubt zu umgehen, aber eine Kopie, so kann es zu konstruieren, das temporäre erstellen Sie direkt in das initialisierte Objekt. So können Sie am Ende sehr gut mit dem gleichen code generiert. Aber der copy Konstruktor, selbst wenn die Kopie erstellte (optimierte), müssen weiterhin verfügbar sein. I. e wenn Sie eine private Kopie-Konstruktor, dieser code ist ungültig, wenn der code, in dem es erscheint, hat keinen Zugriff darauf.
Die zweite ist die sogenannte copy-Initialisierung, denn wenn die Art der Initialisierung ist eine andere Art, ein temporäres Objekt erstellt wird, versuchen, die implizit konvertieren der rechten Seite auf die linke Seite:
Erstellt der compiler ein temporäres Objekt vom Typ myclass dann, wenn es einen Konstruktor, der einen int. Dann initialisiert das Objekt mit der temporären. Auch in diesem Fall werden die temporären erstellt wurden, können direkt in das initialisierte Objekt. Sie können diesen Schritten Folgen, durch das drucken von Nachrichten in Konstruktoren /Destruktoren der Klasse und mit der option
-fno-elide-constructors
für den GCC. Es nicht versucht zu umgehen, aber kopiert Sie dann.Auf einer Seite-beachten Sie, dass der code oben hat nichts zu tun mit einem Zuweisungsoperator. In beiden Fällen, was passiert, ist eine Initialisierung.
Die zweite kann oder kann nicht rufen Sie für eine zusätzliche
myclass
- Objekt-Konstruktion wenn " copy elision ist nicht implementiert, die von Ihrem compiler. Jedoch, die meisten Konstruktoren haben copy elision standardmäßig aktiviert, selbst ohne jegliche Optimierung wechseln.Hinweis Initialisierung, während der Bau nie ruft den Zuweisungsoperator.
Immer im Hinterkopf behalten:
In der zweiten, ein temporäres Objekt wird zunächst erstellt und dann kopiert wird in das Objekt x mit myClass copy-Konstruktor. Daher sind beide nicht identisch.
Schrieb ich Folgendes versuchen, und
veranschaulichenzu verstehen, was Los ist:Wenn ich kompilieren und ausführen dieses Codes bekomme ich die folgende Ausgabe:
Dies würde scheinen zu zeigen, dass es keinen Unterschied zwischen den beiden Aufrufe in der main-Funktion, aber das wäre falsch. Als litb darauf hingewiesen, dass der copy-Konstruktor muss verfügbar sein, damit dieser code funktioniert, auch wenn es bekommt erstellte in diesem Fall. Um zu beweisen, dass, bewegen Sie einfach den copy-Konstruktor im code oben, um den privaten Teil der Klassendefinition. Sollten Sie die folgende Fehlermeldung angezeigt:
Beachten Sie auch, dass der Zuweisungsoperator ist nie genannt.