Referenzen



  • Hallo ihr,

    ich steh gerade vor folgendem Problem:

    Was sind Referenzen in C++ oder noch besser für was brauch ich sie hauptsächlich.Würde mich sehr freuen wenn ihr mir da ein kurzes Beispiel machen könntet ohne, und als Vergleich mit Referenzparameter. Hab Montag Prüfung und sollte es bis dahin etwa verstanden haben.

    Ich brauch deshalb echt eure Hilfe 😉

    Also bis dann und schonmal danke !



  • referenzen sind ein alias name für ein objekt.
    wenn du eine referenz veränderst, veränderst du automatisch auch das Objekt.

    referenzparameter in funktionen haben zudem den vorteil, dass beim aufruf der funktion kein objekt kopiert wird,somit is der funktionsaufruf schneller.



  • Kannst du oder mir jemand mal ein kleines Programmfragment schreiben ohne header usw. nur ein Fragment wo ich den Unterschied zwischen mit und ohne Referenz sehen kann. Irgendwie obwohl ich das ca. weiss was es ist gehts mir nicht in den Kopf wo der Sinn darin liegt 🙂

    Sorry scheint ne Newbie Frage zu sein, aber jeder fängt mal Klein an ^^^

    Danke



  • Ähnlich wie pointer:

    int var=0;
    int *p=&var;	//Pointer
    int &r=var;	//Referenz
    
    p=6;	//Fehler: müsste *p=6 sein
    r=6;	//entspricht *p=6;
    

    Refernzen werden einmal gleich bei der Deklaration mit einer Variable intitalisiert wie ein pointer. Danach wird immer nur der Wert geändert.



  • Du meinst mit Pointer Zeiger nehm ich an oder ?



  • da liegst du richtig 😉

    Edit: Einfacher??? Einfacher gehts nicht, da kommen doch nur 3 Variablen vor.
    Was verstehst du denn nicht?
    Wenn du Zeiger nicht verstehst, brauchst du mit Referenzen gar nicht anfangen (obwohl, du könntest schon, aber lern trotzdem erstmal pointer)

    In Kurzform:

    int *p; 	//Pointer deklarieren, durch *
    p=&var;		//Pointer beinhaltet jetzt Adresse der Variable var.
    p=6;		//Fehler, p kann nicht auf '6' zeigen, Adresse '6' gibts nicht
    *p=6;		//Damit ist gemeint: der Wert von p (der Stern *) ist sechs.
    
    //Edit: Präziser: Die Stelle im Speicher, auf die der Pointer Zeigt, hat den Wert 6. In diesem Fall ist diese Stelle im Speicher die variable var, auf die der Pointer Zeigt.
    

    Mit der Referenz kannst du ansonsten umgehen wie mit einer normalen Variable, d.h. du sparst dir den Stern *, um anzuzeigen das du den Wert meinst und nicht die Adresse. Das brauchst du bei Refernzen nicht.

    r=6;	//Ist von vornherein klar: Hier ist der Wert gemeint, denn die Adresse kann man nicht mehr Ändern
    

    Hoffe das war jetzt klar.



  • Ähm :)....*peinlich* aber mir fiel gerade auf das dein Beispiel (danke übrigens) ähm glaub zu schwer ist für mich. Sorry

    Gehts vielleicht etwas einfacher wenn nicht versuch ichs irgendwie zu verstehen aber würde mich freuen



  • naja, korrekt übersetzt heisst Pointer tatsächlich Zeiger.. 🙄



  • @randa

    int var=0;
    int *p=&var;	//Pointer
    int &r=var;	//Referenz
    
    p=6;	//Fehler: müsste *p=6 sein
    r=6;	//entspricht *p=6;<--das stimmt nicht r=6<=>var=6,es findet keine dereferenzierung statt
    

    @Dai
    hier etwas einfacher(einfach mal compilieren, dann wirds klar):

    #include <iostream>
    using namespace std;
    int main(){
        int a=0;
        int& ra=a;
        ra=6;
        cout<<a<<endl<<ra;
    }
    


  • LEUTE !!!!!! AHHHHH fangt nicht mit Dereferenzierung an bevor ich nichtmal Referenzieren ? *g* kann 🙂

    Step by Step und easy bitte



  • das @randa sollte eigentlich aussagen, dass dies nich direkt auf dich bezogen war 🙂



  • @ otze: stimmt. Ich habs bewusst so erklärt, das es im Vergleich mit dem Pointer klar wird. Es wäre die äquivalente Syntax.

    Ich hab weiter oben noch per Edit einen Erklärungsversuch gemacht.



  • Dai schrieb:

    LEUTE !!!!!! AHHHHH fangt nicht mit Dereferenzierung an bevor ich nichtmal Referenzieren ? *g* kann 🙂

    Step by Step und easy bitte

    Lass es lieber bleiben und lern HTML oder VB...



  • So ein dummes Geschwätz lern du dich lieber in Sozialkompetenz bezogen auf den Post über mir

    @Randa ok habs verstanden das Beispiel aber für was brauch ich sowas z.B.?

    Wenn ich das nun richtig deute, verändert sich in deinem Beispiel das a mit obwohl ich ra ändere nur was bringt mir sowas ?



  • hier bringts dir was(btw ich bin nicht randa^^):

    #include<iostream>
    using namespace std;
    void function(int& Object){
        Object=5;
    }
    int main(){
    int a;
    function(a);
    cout<<a;
    }
    

    is zwar ein super primitives beispiel,aber das prinzip sollte klar sein(ich hoffe, du kennst schon funktionen :P)

    //edit erklärung:
    wenn function(a) aufgerufen wird, wird innerhalb der funktion(wie in meinem ersten punkt schon erwähnt) nur ein alias-name für a genommen, alle veränderung die function also mit Object macht, werden direkt auf a übertragen(wenn ich aber innerhalb der funktion aus int& einfach int mache, passiert garnichts)



  • Sagt mal Leute ohne jetzt beleidigend zu wirken. Denkt ihr ich wäre blöd nur weil ich euch jetzt was frage ???

    Ich sehe absolut keinen Sinn sich über Leute lustig zu machen die versuchen gerade etwas zu verstehen. Schlimmer ist eher wenn man sich darüber lustig macht denn jeder von euch musste es auch mal lernen.

    Wenn das hier so ein "Jugend" Forum ist sagts mir dann bin ich hier eh falsch

    Zum Thema Funktionen: Ja kann ich aber wie oben erwähnt kein Grund nen 🙂 dahinter zu machen



  • Danke für dein Beispiel otze



  • Ein Versuch meinerseits:

    void funcref(int& x) 
    {
    	x++;
    }
    
    void funcval(int x)
    {
    	x++;
    }
    
    int main()
    {
    	int a = 1;
    	funcref(a);
    	// nach dem Funktionsaufruf ist a = 2, weil mit dem Original gearbeitet wurde.
    	cout << a << endl;
    
    	int b = 1;
    	funcval(b);
    	// nach dem Funktionsaufruf ist b = 1, weil nur mit einer Kopie gearbeitet wurde
    	cout << b << endl;
    
    	return 0;
    }
    

    mfg JJ



  • Vielen Dank auch an dich John



  • //edit sorry, hab deine aussage auf mich bezogen,dickes sorry.



  • Wofür man das braucht ist eine ganz typische Frage und tatsächlich ist die Antwort: Als Anfänger braucht man das (meistens) noch nicht. Das kommt automatisch erst später. Bei mir war das damals so dass ich das automatisch gechekt hab sobald ichs gebraucht hab.
    Wie otze oben gezeigt hat ist es eine typische Anwendungsmöglichkeit von Zeigern, dass sie als Argumente von Funktionen verwendet werden, um diesen in der Funktion zu verändern. Wenn du eine normale Variable als Argument hättest, würde nur eine Kopie verwendet werden und die Originale Variable ändert sich nicht.
    Benutz aber wie oben otze in einem solchen Fall für den Anfang nur Referenzen.

    oh, was ich erklärt hab hat schon jemand gepostet.
    Muss mich mal in Zehnfingerschreiben üben dann bin ich auch mal der erste 😉


Anmelden zum Antworten