Unterschied Referenz, Zeiger



  • lol mich würd mal intressieren wie Referenz intern behandelt wird.
    Bestimmt ist es auch ein Zeiger intern.

    funk(int& var)
    {

    }



  • CPlusPlusNewbie schrieb:

    lol mich würd mal intressieren wie Referenz intern behandelt wird.
    Bestimmt ist es auch ein Zeiger intern.

    funk(int& var)
    {

    }

    Ja, in diesem Fall schon.

    void test()
    {
    int x = 1;
    int& xx = x;
    }
    

    In diesem Fall nicht.


  • Mod

    CPlusPlusNewbie schrieb:

    lol mich würd mal intressieren wie Referenz intern behandelt wird.
    Bestimmt ist es auch ein Zeiger intern.

    Kann sein, muss aber nicht. Genausowenig muss ein Zeiger intern nicht unbedingt ein Zeiger sein. Das übersetzte Programm muss sich bloß so verhalten, als ob es zu deinem Code passt. Das beobachtbare Verhalten schließt aber Details der Implementierung größtenteils aus. Gerade bei Referenzen, bei denen man nicht einmal theoretisch die Adresse der Referenz erhalten kann, sind möglichen Optimierungen Tür und Tor geöffnet.

    Aber wenn eine Referenz tatsächlich eine Identität im übersetzten Programm hat, dass wird diese einem Zeiger ähneln, ja.



  • Also bislang war ich ja kein Fan von Referenz, sondern eher von Zeigern.

    Aber Referenz ist doch viel besser als Zeiger ?? Referenz verwend ich einfach so wie die normale Variable und muss mich nicht mit Zeiger rumschlagen wenn ich es nicht brauche.



  • Newbie68697 schrieb:

    Aber Referenz ist doch viel besser als Zeiger ?? Referenz verwend ich einfach so wie die normale Variable und muss mich nicht mit Zeiger rumschlagen wenn ich es nicht brauche.

    Referenzen können sich aber nicht ändern.
    Das führt dann dazu, dass Klassen, die Referenzen als Member haben, keinen idR Zuweisungsoperator vernünftig implementieren können.



  • hardware schrieb:

    Man kann einen Zeiger auf etwas anderes zeigen lassen, eine Referenz zeigt immer auf dasselbe Objekt. Außerdem kann ein Zeiger auf 'nichts' zeigen, bzw. ein nullptr sein, aber eine Referenz kann dies nicht.

    void func(int& ref) {}
    int main()
    {
        int* x = 0;
        func(*x); // läuft
    }
    

    Referenzen sind das Selbe wie Pointer, nur dass der Kompiler keinen Pointer Syntax verlangt.



  • eine Referenz kann nicht 0 sein, muss auf etwas vorhandenes initalisiert sein und darf nachträglich nicht geändert werden - das sind ganz ordentliche Unterschiede zu Zeigern

    Referenzen helfen dabei den Code sauberer zu schreiben - siehe z.B. const-correct
    der Funktionlitätsvergleich ist hier fehl am Platz weil Referenzen eher ein besseres Design-Element als Pointer sind - denn es ist teilweise schön zu wissen das etwas für immer seinen Zustand hält und nicht ständig mit if/else oder sonstwie hingebogen werden kann


  • Mod

    Nathan schrieb:

    Newbie68697 schrieb:

    Aber Referenz ist doch viel besser als Zeiger ?? Referenz verwend ich einfach so wie die normale Variable und muss mich nicht mit Zeiger rumschlagen wenn ich es nicht brauche.

    Referenzen können sich aber nicht ändern.
    Das führt dann dazu, dass Klassen, die Referenzen als Member haben, keinen idR Zuweisungsoperator vernünftig implementieren können.

    Doch, können sie - ich nenne folgendes jedenfalls vernünftig:

    struct A {
    	int& ref;
    	std::string str;
    
    	A& operator=(A const& a) {
    		if (this != &a) {
    			this->~A(); // Hier erwünscht, nicht nötig
    			new (this) A(a);
    		}
    		return *this;
    	}
    };
    


  • Gast3 schrieb:

    eine Referenz kann nicht 0 sein, muss auf etwas vorhandenes initalisiert sein und darf nachträglich nicht geändert werden - das sind ganz ordentliche Unterschiede zu Zeigern

    Referenzen helfen dabei den Code sauberer zu schreiben - siehe z.B. const-correct
    der Funktionlitätsvergleich ist hier fehl am Platz weil Referenzen eher ein besseres Design-Element als Pointer sind - denn es ist teilweise schön zu wissen das etwas für immer seinen Zustand hält und nicht ständig mit if/else oder sonstwie hingebogen werden kann

    Das sind übliche Konventionen - das ist richtig.



  • Mr.Long schrieb:

    Gast3 schrieb:

    eine Referenz kann nicht 0 sein, muss auf etwas vorhandenes initalisiert sein und darf nachträglich nicht geändert werden - das sind ganz ordentliche Unterschiede zu Zeigern

    Referenzen helfen dabei den Code sauberer zu schreiben - siehe z.B. const-correct
    der Funktionlitätsvergleich ist hier fehl am Platz weil Referenzen eher ein besseres Design-Element als Pointer sind - denn es ist teilweise schön zu wissen das etwas für immer seinen Zustand hält und nicht ständig mit if/else oder sonstwie hingebogen werden kann

    Das sind übliche Konventionen - das ist richtig.

    Was genau bezeichnest du hier als Konvention?



  • Dass man Referenzen dort benutzen sollte, wo sie nie 0 sein sollten. 😮



  • Mr.Long schrieb:

    Dass man Referenzen dort benutzen sollte, wo sie nie 0 sein sollten. 😮

    Ich persoenlich faende "kann" schoener als "sollte".

    Im Zuge der Lesbarkeit des Codes wuerde ich persoenlich Pointer Referenzen vorziehen, wenn es sich e.g. um Member von Klassen handelt.

    Nichts sagt so schoen ich "owne" die Resource nicht, wie ein nativer Pointer.



  • @Arcoth
    Du nennst Code vernünftig der nichtmal basic exception safety bietet?
    😕


  • Mod

    hustbaer schrieb:

    @Arcoth
    Du nennst Code vernünftig der nichtmal basic exception safety bietet?
    😕

    Ich dachte der Sarkasmus hätte nicht angedeutet werden müssen.


Anmelden zum Antworten