2016-07-31 17 views
4

Ich versuchteWie initialisiert man eine Objektreferenz in C++?

MyClass& x; 
x = MyClass(a,b,c); 

Aber C++ wird mich nicht tun lassen, dies zu tun, weil es am Anfang x denkt, dass nicht initialisiert ist.

Also habe ich versucht

MyClass& x = MyClass(a,b,c); 

aber erhielt Fehler zu tun, sagen invalid initialization of non-const reference of type 'MyClass&' from an rvalue of type 'MyClass'

Was ist falsch daran? Es scheint, dass ich jetzt einfach nichts tun kann. Wie komme ich um das Initialisierungsproblem herum?

Antwort

6

Eine Referenz muss sich auf ein bereits vorhandenes Objekt beziehen. Sie müssen also zuerst ein Objekt haben, bevor Sie sich darauf beziehen können.

MyClass y = MyClass(a,b,c); 
MyClass &x = y; 
9

Eine gewöhnliche Referenz const auf nicht muss mit einer L-Wert-Expression (im wesentlichen eines Ausdruck, der auf eine Speicherstelle verweist) initialisiert werden, z.B.

MyClass o{ a, b, c }; 
MyClass& r = o; 

Wenn die Referenz zu const, oder wenn es sich um eine R-Wert-Referenz (bezeichnet mit &&) ist, dann kann der Initialisierer stattdessen ein rvalue Ausdruck, wie beispielsweise eine temporäre durch einen Funktionsaufruf erzeugt werden:

MyClass const& rc = foo(); 
MyClass&& rr = foo(); 

In diesen Fällen wird für eine lokale Referenz die Lebensdauer des Temporären auf den Umfang der Referenz erweitert. Ein besonderes Merkmal ist, dass, wenn der Initialisierer ein temporäres Ergebnis einer abgeleiteten Klasse erzeugt, das vollständig abgeleitete Klassenobjekt ist, dessen Lebensdauer verlängert ist, d. H. Es gibt kein Aufteilen auf die für die Referenz spezifizierte Klasse.

Allgemeiner kann die Referenz an jeden Teil eines temporären Objekts gebunden werden, solange dieses Teil einen kompatiblen Typ hat und dadurch die Lebensdauer des vollständigen temporären Objekts verlängert wird.

Verwandte Themen