C++ - Was macht das & nach dem Datentyp?

OP #5647541
Lesenswert?

Hallo,
ich bin über folgendes Konstruktur gestoßen. Was macht da das &?

Beispiel:
JsonObject& root = jsonBuffer.createObject();

Quelle:
https://github.com/bblanchon/ArduinoJson

Ich hab nichts recht gefunden bzw. weiß ich nicht, nach was ich da 
suchen kann.

Lg, Weinga-Unity
#5647660
Lesenswert?

Das nennt sich Referenz und zeigt auf eine Instanz. Im Prinzip ist es 
ähnlich wie ein Pointer, der aber immer auf etwas zeigen muss. Man 
verwendet es, wenn man Objekte nicht kopieren will oder kann, z.B. bei 
einer Übergabe an eine Funktion.

Aber Vorsicht, die Referenz kontrolliert (in der Regel) nicht die 
Lebensdauer der Instanz auf die sie zeigt. Wenn die Instanz wegfällt ist 
ein Zugriff auf die Referenz undefiniert.

In deinem Fall zeigt die Referenz auf den Rückgabewert der Funktion. In 
diesem Fall sorgt der Compiler dafür, dass der Rückgabewert so lange wie 
die Referenz lebt (reference lifetime extension).
#5648077
Lesenswert?

M.K. B. schrieb:
> Das nennt sich Referenz und zeigt auf eine Instanz. Im Prinzip ist es
> ähnlich wie ein Pointer, der aber immer auf etwas zeigen muss.

Das ist eher die Sicht des Compilers, der das meist in der Art umsetzt. 
Als Programmierer ist es eher so gedacht, dass man eine Referenz als 
einen anderen Namen für ein Objekt ansieht, ähnlich wie ein typedef ein 
anderer Name für einen Typ ist.

> In deinem Fall zeigt die Referenz auf den Rückgabewert der Funktion. In
> diesem Fall sorgt der Compiler dafür, dass der Rückgabewert so lange wie
> die Referenz lebt (reference lifetime extension).

Das gilt aber nur, wenn die Funktion selbst keine Referenz zurückgibt.

Schei... Code schrieb:
> Und so wie verwendet, macht eine Referenz keinen Sinn. Hier gehörte eine
> echte Variable hin.

Wie kommst du darauf, dass das Objekt unbedingt kopiert werden muss 
statt nur referenziert - oder dass es überhaupt kopiert werden darf?
#5648153
Lesenswert?

Rolf M. schrieb:
> M.K. B. schrieb:
>> Das nennt sich Referenz und zeigt auf eine Instanz. Im Prinzip ist es
>> ähnlich wie ein Pointer, der aber immer auf etwas zeigen muss.
>
> Das ist eher die Sicht des Compilers, der das meist in der Art umsetzt.
> Als Programmierer ist es eher so gedacht, dass man eine Referenz als
> einen anderen Namen für ein Objekt ansieht, ähnlich wie ein typedef ein
> anderer Name für einen Typ ist.

Bei der vermutlich häufigsten Anwendung als Funktionsparameter ist die 
Referenz durchaus so gedacht, ähnlich wie ein Pointer gesehen zu werden.

Oliver
#5648345
Lesenswert?

Wobei mir das:

Weinga U. schrieb:
> JsonObject& root = jsonBuffer.createObject();

fragwürdig aussieht.
Referenz den Return-Wert einer Create-Methode?

zumal die signatur laut 
https://arduinojson.org/v5/api/jsonbuffer/createobject/
so aussieht:
1
JsonObject createObject();

Sprich, da kann man auch nicht argumentieren:

mh schrieb:
> Wenn du auch nur einen Blick in die Doku geworfen hättest, wüsstest du,
> dass man an dieser Stelle eine Referenz verwenden MUSS.

Wenn man einen blick in die offizielle Doku geworfen hat, sieht man, 
dass entweder die Doku oder der Beispielcode falsch sein muss.

Das müsste mindestens Warnungen hageln.
Gast #5648362
Lesenswert?

Vlad T. schrieb:
> Wobei mir das:
>
> Weinga U. schrieb:
>> JsonObject& root = jsonBuffer.createObject();
>
> fragwürdig aussieht.
> Referenz den Return-Wert einer Create-Methode?
>
> zumal die signatur laut
> https://arduinojson.org/v5/api/jsonbuffer/createobject/
> so aussieht:JsonObject createObject();
>
> Das sollte mindestens Warnungen hageln, oder nicht?

Zum Glück ist dem Compiler die Dokumentation egal ;-) Im Quelltext ist 
der Rückgabewert eine Referenz.
Gast #5651087
Lesenswert?

gugl schrieb:
> mh schrieb:
>> Zum Glück ist dem Compiler die Dokumentation egal ;-) Im Quelltext ist
>> der Rückgabewert eine Referenz.
>
> Wie schön, dann sollte es aber
>
> JsonObject * root = jsonBuffer.createObject();
>
> lauten !
>
> Pointer (*)

Du weißt, dass es um c++ geht und was eine Referenz ist?
Gast #5651107
Lesenswert?

Meiner bescheidenen Meinung nach wird eine Referenz genutzt um den 
(jetzt kommts) Pointer auf eine Variable oder sonstige Struktur zu 
bekommen. Man kann die Referenz dann zB. in einem Pointer speichern. da 
sind c und c++ gleich!
Gast #5651120
Lesenswert?

Ach da scheint ja was dran zu sein. C++ ist eben deswegen eine Krankheit 
weil es Zeichen als Operator verwendet, die eigentlich schon anderweitig 
belegt sind, also Doppelt und Dreifachnutzung von Symbolen. Schön ist 
das nicht:(
#5651143
Lesenswert?

gugl schrieb:
> C++ ist eben deswegen eine Krankheit weil es Zeichen als Operator
> verwendet, die eigentlich schon anderweitig belegt sind

C++ ist toll, weil man für Klassen die bekannten Operatoren definieren 
kann und es sich dann wie gewohnt verhält. Zum Beispiel eine Klasse, die 
mit fixed point Dezimal rechnet, sich aber durch +-*/ Operatoren wie 
eine normale Rechnung verwenden lässt.
Beitrag #5651839 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren