Wozu Referenzübergabe



  • Ok -- *wieso* hat C++ dann Argumentübergabe per Referenz, wenn
    das nichts Neues bietet gegenüber dem seit 35 Jahren in C
    eingebauten Zeiger-"call by reference" ??
    (Ist C++ nicht auch so schon kompliziert genug ?)



  • Das wurde doch ausführlich erklärt! Und das was ness da gemacht hat erzeugt schlicht und einfach undefiniertes Verhalten.



  • z.B. desshalb:

    ö schrieb:

    Referenzen sind fuer die Leute die Zeiger nicht raffen 😉
    Und um Exceptions zu fangen(Objekte)

    Der Umgang mit Referenzen ist für Anfänger i.d.R. tatsächlicher erheblich leichter zu verstehen und nachzuvollziehen als der, mit Pointern!



  • Sorry, aber Referenzen sind doch keine "vereinfachung" von Pointern. Es wurde also bestimmt nicht eingeführt, um es Nichts-Raffern einfacher zu machen. Pointer brauche ich um auf eine bestimmte Adresse im Speicher zu zeigen. Das ist doch erstmal klar, oder?

    Und eine Referenz zeigt ebend NICHT auf eine Adresse. Wo bitte haben folglich Referenzen und Pointer eine auch nur annähernde Gemeinsamkeit???

    Eine Referenz ist ein alternativer Name für ein Object. Klingt doch schon ganz anders, oder?`Steht als erster Satz im Kapitel zu Referenzen im Buch von Bjarne Stroustrup.



  • Eine Referenz ist ein alternativer Name für ein Object. Klingt doch schon ganz anders, oder?<<

    In der Tat. Dann stelle ich mir aber die Frage: Wozu (außer für eine Teilnahme
    beim IOCCC) braucht ein und dasselbe Objekt mehr als einen Namen ??



  • no-op schrieb:

    Eine Referenz ist ein alternativer Name für ein Object. Klingt doch schon ganz anders, oder?<<

    In der Tat. Dann stelle ich mir aber die Frage: Wozu (außer für eine Teilnahme
    beim IOCCC) braucht ein und dasselbe Objekt mehr als einen Namen ??

    Damit man es in einem anderen Scope sehen kann?



  • Referenzen verbinden Pointer mit der einfachen Syntax von Nicht-Zeigern. Siehe Post von geloescht.



  • no-op schrieb:

    Eine Referenz ist ein alternativer Name für ein Object. Klingt doch schon ganz anders, oder?<<

    In der Tat. Dann stelle ich mir aber die Frage: Wozu (außer für eine Teilnahme
    beim IOCCC) braucht ein und dasselbe Objekt mehr als einen Namen ??

    Damit das Object auch in anderen Gültigkeitsbereichen bearbeitet werden kann. (wie von FireFlow gesagt) Der Unterschied ist halt, das ein Pointer eine Variable ist, die auf ein Object zeigt. Eine Referenz ist aber DAS Object, nur unter einem anderen Namen. Ich kann dann z.B. in einer Funktion mit genau dem Object weiter arbeiten, das mir als Ref-Parameter übergeben wurde. Bei einem Pointer ist das ja nicht so, da bekomme ich einen Zeiger, aber nicht DAS Object mit dem ich arbeiten soll. Somit gibts einen definitiven Unterschied zwischen Pointern und Refs.



  • Somit gibts einen definitiven Unterschied zwischen Pointern und Refs.<<

    Einen formalen Unterschied scheint es tatsächlich zu geben - aber
    der Compiler macht ja vermutlich aus f(int* i) und
    f(int& i) in beiden Fällen eine Argumentübergabe mittels eines Zeigers,
    der auf die Adresse von i zeigt.
    Das ist dann doch "gehupft wie gesprungen", oder ?



  • für dich vielleicht, aber ich erspare mir, jedesmal den umständlichen zeigersyntax zu verwenden. zumal es wie gesagt oft garnicht anders geht.



  • Referenzen bezeichnen lvalues. Das ist IMO das entscheidende. Dass sie nicht veränderbar sind und folglich immer initialisiert werden müssen, ist davon unabhängig und hat IMO eher syntaktische Gründe.

    Was mein ich damit? Nehmen wir z.B. einen Ausdruck wie a[10] = 5. Ist a ein Array, ist alles klar -- a[10] ist laut Sprachdefinition ein lvalue, ich kann dem also etwas zuweisen. Will ich den [] Operator für einen eigenen Typ überladen, muss ich irgendwie einen lvalue zurückgeben, und das geht gar nicht anders als mit Referenzen.



  • nO-oP schrieb:

    Somit gibts einen definitiven Unterschied zwischen Pointern und Refs.<<

    Einen formalen Unterschied scheint es tatsächlich zu geben - aber
    der Compiler macht ja vermutlich aus f(int* i) und
    f(int& i) in beiden Fällen eine Argumentübergabe mittels eines Zeigers,
    der auf die Adresse von i zeigt.
    Das ist dann doch "gehupft wie gesprungen", oder ?

    Ich glaube nicht das das Compilat gleich ist. Wird wohl auch Compilerabhängig sein. Aber eigentlich müsste eine Reference keine extra Variable beanspruchen.

    Aber dennoch: Der Compiler macht einiges, was gehupft wie gesprungen ist. Wenn es danach geht, kann man gleich nur C oder gar Assembler programmieren. Aber darum geht es bei Hochsprachen ebend nicht. Glaubst du etwa, das private Attribute einer Klasse anders compiliert werden als public Attribute? Nein, am Ende kommt das selbe raus. Die C++-Sprachelemente sind Werkzeuge, die einem beim Programmieren das Leben leichter machen sollen, Sicherheit usw. bieten. Was am Ende rauskommt, interessiert einen (eigentlich) nicht.



  • Ich vermutete ja nur, daß die Argumentübergabe per Referenz im Grunde
    dasselbe ist wie per Zeiger, nur mit dem formalen Unterschied "&" statt "*".
    Beim Überladen von Operatoren ist "&" sicherlich formal unabdingbar, das will ich nicht bezweifeln.


Anmelden zum Antworten