Forum: PC-Programmierung C++ - Was macht das & nach dem Datentyp?


von Weinga U. (weinga-unity)


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

von Bärbel (Gast)


Lesenswert?


von M.K. B. (mkbit)


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).

von Schei... Code (Gast)


Lesenswert?

Und so wie verwendet, macht eine Referenz keinen Sinn. Hier gehörte eine 
echte Variable hin.

von mh (Gast)


Lesenswert?

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

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

von Rolf M. (rmagnus)


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?

von Oliver S. (oliverso)


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

von gugl (Gast)


Lesenswert?

Standard c ist das nicht! Normal steht das & vor der Variable und gibt 
deren Adresse zurück. Pointer werden mit * deklariert!

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

"JsonObject&" das ist einfach der Name ;)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

gugl schrieb:
> Standard c ist das nicht!

Ist ja auch C++.

von Vlad T. (vlad_tepesch)


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.

: Bearbeitet durch User
von mh (Gast)


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.

von gugl (Gast)


Lesenswert?

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 (*)

von mh (Gast)


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?

von gugl (Gast)


Lesenswert?

mh schrieb:
> Du weißt, dass es um c++ geht und was eine Referenz ist?

bin mir nicht sicher was du meinst, kannste das mal erklären?

von gugl (Gast)


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!

von gugl (Gast)


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:(

von M.K. B. (mkbit)


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.

von Rolf M. (rmagnus)


Lesenswert?

gugl schrieb:
> 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.

Das & ist an der Stelle kein Operator. Abgesehen davon belegt C den 
&-Operator auch bereits doppelt.

Beitrag #5651839 wurde von einem Moderator gelöscht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.