2015-05-13 11 views
9

Me und ein Kollege von mir hatte eine Debatte über obWeird-C++ Konstruktor kopieren, ohne Standardkonstruktors

Pt pt; 

und

Pt pt = Pt(); 

gleichwertig sind. Ich vermutete, dass im zweiten Fall Kopierauftrag aufgerufen werden konnte, aber wie sich herausstellt, ist dies nicht der Fall.

Wie wir unser kleines Experiment lief habe ich beschlossen, eine seltsame Bit zu testen, dass mein Kollege dachte würde kompilieren nicht einmal:

//here the compiler calls a copy constructor and doesn't call the default constructor prior to that 
// O_o 
Pt pt = pt; 

Hier ist eine Arbeitsprobe: http://ideone.com/XmJSz7

Also, die Frage ist - was in geht weiter:

Pt pt = pt; 
+0

"* Ich vermutete, dass im zweiten Fall Kopie Zuordnung aufgerufen werden könnte, aber wie sich herausstellt, ist es nicht der Fall. *" Ich vermute, Sie schließen aus der Tatsache, dass etwas nicht geschehen ist, dass es nicht passieren konnte. Dies ist eine ungültige Begründung. Wenn ich über die Straße gehe, ohne in beide Richtungen zu schauen, und nicht von einem Auto angefahren werde, heißt das, dass jemand, der gesagt hat, ich hätte von einem Auto angefahren werden können, falsch war? –

+0

Gültiger Punkt. Schlagen Sie vor, dass Pt pt = Pt(); könnte in einigen Fällen Kopierkonstruktor aufrufen? Wenn ja - könnten Sie ein Beispiel geben? –

+0

@Vorren - über diese 'Pt pt = Pt()', aktualisierte ich meine Antwort. –

Antwort

5

Konstruktionen wie type object = something Anruf Kopierkonstruktoren, nicht Zuweisungsoperatoren

diesen Hintergrund zu haben, hier ist was passiert:

  1. Pt pt = -> an diesem Punkt Pt Objekt erstellt wird, mit dem Namen pt (nichts an diesem Punkt initialisiert)
  2. = pt; -> an dieser Stelle , pt 's copy-Konstruktor mit dem Argument aufgerufen wird - selbst (pt)
  3. als pt erstellt, aber nicht initialisiert (in 1.), das ist (ein bisschen) gültig - pt' s Kopie co nstructor (in 2.) wird „richtig“ ausgeführt sein, rechtsseitige Argument nehmen, wie die bereits bestehenden und uninitialized Objekt pt (von 1. wieder)

Kurz - das ist schlecht.

Es ist erwähnenswert, dass, wenn das pt Objekt global oder statisch ist, es wird bei Schritt 1. initialisiert default-sein - nach den = erreichen.

EDIT: in Bezug auf das anfängliche "Puzzle" Pt pt = Pt();, können Sie diese Frage sehen: Is there a difference in C++ between copy initialization and direct initialization? und seine akzeptierte Antwort. Und dieser scheint auch interessant: How variable is initialized by default constructor in c++