2017-10-30 8 views
0

lese ich ein article on rvalue-references, aber ich habe durch den folgenden Auszug verwechselt werden:Was bedeutet `a = b()`, wenn sowohl `a` als auch` b` die Klasse `X` haben?

X foo(); 
X x; 
// perhaps use x in various ways 
x = foo(); 

Hier X einig benutzerdefinierte Typ.

Ich weiß, dass X foo(); wird X Konstruktor aufrufen, und ich bin mir ziemlich sicher X x; wird nicht.

Aber was bedeutet die Linie x = foo();? Wird ein Konstruktor aufgerufen? Und was würde x = foo; tun?

Versuchen Sie, wie ich könnte, konnte ich nicht die richtigen Worte herausfinden, um herauszufinden, was dieser Code bedeutet.

+9

Ich bin mir ziemlich sicher 'X foo();' ist eine Funktionsdeklaration. – tkausl

+3

Sie schreiben * "Ich bin mir ziemlich sicher, X x; wird nicht [den Konstruktor von X aufrufen]" * Warum sagst du das? – MFisherKDX

+0

Ich war unter diesem Eindruck, da C++ eine Methode zum Deklarieren eines Objekts ohne Aufruf des Konstruktors – Mahkoe

Antwort

7

Ich weiß, dass X foo(); No X Konstruktor

nennen, wird es nicht. Es wird erklären (aber nicht definieren) eine Funktion foo genannt, die keine Argumente hat, und gibt eine X.

und ich bin ziemlich sicher, dass X x; nicht.

Ja wird es, wenn es eins hat. Mit den obigen Korrekturen zu Ihrem Verständnis, sollte die Antwort auf Ihre Frage jetzt offensichtlich sein, aber:

Allerdings, was bedeutet die Linie x = foo();?

Es bedeutet, rufen Sie die Funktion foo, und speichern Sie das Ergebnis in x.

+0

Neugierig ... in diesem Fall führt dies zu zwei wichtigeren Fragen: Was ist, wenn ich ein Objekt vom Typ X deklarieren will und * nicht * einen Aufruf an den Konstruktor erzeugen möchte, und wie kann ich den Unterschied zwischen X foo erkennen?(); "ein Prototyp für eine Funktion sein, die ein X zurückgibt und keine Argumente annimmt" und eine "Deklaration eines Objekts vom Typ X ist, das einen Aufruf seines Konstruktors erzeugt (der keine Argumente hat)"? – Mahkoe

+3

* "Was ist, wenn ich ein Objekt vom Typ X deklarieren und keinen Aufruf an den Konstruktor erzeugen will" * - Das geht nicht. Aber wenn Sie könnten, wäre das nur eine Speicherzuweisung und es gibt natürlich eine Vielzahl von Möglichkeiten, Speicher in C++ zuzuordnen. –

+1

* "Wie kann ich den Unterschied zwischen X foo() erkennen; ein" Prototyp für eine Funktion ... "zu sein und eine" Deklaration eines Objekts ... "zu sein?" * - Einfach. Es ist immer Ersteres. Niemals Letzteres. –

Verwandte Themen