Seite 1 von 1
Referenzen und Zeiger
Verfasst: Do Nov 08, 2012 12:45 pm
von Glocke
Hiho, ich bin im Wiki
http://www.proggen.org/doku.php?id=cpp:ref:start über Referenzen gestolpert. Jetzt stellt sich mir die Frage, wann ich Zeiger und wann ich Referenzen verwenden soll. Unterscheiden sich Zeiger und Referenzen bezüglich der Zugriffsgeschwindigkeit?
Hoffe ihr könnt mir da weiterhelfen
LG Glocke
Re: Referenzen und Zeiger
Verfasst: Do Nov 08, 2012 1:18 pm
von fat-lobyte
Tag.
Die Grundregel lautet wie folgt:
Verwende überall wo du kannst Referenzen.
Dort wo du es nicht kannst, verwende Zeiger. Das beschränkt sich auf wenige Fälle: klassische (C-)Arrays, klassische (C-)Strings, und mehr fällt mir hier gar nicht mehr ein.
Doch! Bei dynamic_cast<> macht es einen Unterschied, ob du ihm einen Zeiger oder Referenz fütterst: bei einem falschen Zeiger bekommst du nullptr als Rückgabewert, bei einer falschen Referenz bekommst du keinen Rückgabewert sondern eine Exceptions (ich glaube std::bad_cast oder so).
Das sind aber Ausnahmefälle, die bei guten Design nicht vorkommen sollten. Verwende also am besten immer Referenzen!
Glocke hat geschrieben:Unterscheiden sich Zeiger und Referenzen bezüglich der Zugriffsgeschwindigkeit?
Nein. Im Assemblercode wirst du nicht mehr zwischen Zeiger und referenzen unterscheiden können.
Re: Referenzen und Zeiger
Verfasst: Do Nov 08, 2012 1:23 pm
von Xin
Glocke hat geschrieben:Hiho, ich bin im Wiki
http://www.proggen.org/doku.php?id=cpp:ref:start über Referenzen gestolpert. Jetzt stellt sich mir die Frage, wann ich Zeiger und wann ich Referenzen verwenden soll. Unterscheiden sich Zeiger und Referenzen bezüglich der Zugriffsgeschwindigkeit?
Ich kann fat-lobytes Comment nur unterschreiben und vielleicht noch so ergänzen:
Zeiger verwendest Du statt Referenzen, wenn Du einen invaliden Zustand brauchst (nullptr), bzw. die Variable verändern darf, also mit der Zeit auf ein anderes Objekt zeigen soll.
Wann immer die Variable belegt sein soll und nicht im Laufe des Programms die Referenz auf ein anderes Objekt annehmen soll, sollte es sich um eine Referenz handeln.
Mit einem Pointer kannst Du mehr machen als mit einer Referenz - wenn Du Du das nicht brauchst, verwende auch wirklich eine Referenz, dann kannst Du dieses Mehr auch nicht versehentlich machen und verhinderst so Fehler.
Re: Referenzen und Zeiger
Verfasst: Do Nov 08, 2012 1:37 pm
von Glocke
fat-lobyte hat geschrieben:Die Grundregel lautet wie folgt:
Verwende überall wo du kannst Referenzen.
Bisher habe ich gar keine Referenzen benutzt. Heißt das ich kann das jetzt einfach auf Referenzen umbauen?
Xin hat geschrieben:Mit einem Pointer kannst Du mehr machen als mit einer Referenz - wenn Du Du das nicht brauchst, verwende auch wirklich eine Referenz, dann kannst Du dieses Mehr auch nicht versehentlich machen und verhinderst so Fehler.
Was ist denn dieses "mehr" der Pointer gegenüber den Referenzen? Du meinst damit sicher nicht nur dieses "kann-NULL-sein"
LG Glocke
Re: Referenzen und Zeiger
Verfasst: Do Nov 08, 2012 1:48 pm
von Xin
Glocke hat geschrieben:fat-lobyte hat geschrieben:Die Grundregel lautet wie folgt:
Verwende überall wo du kannst Referenzen.
Bisher habe ich gar keine Referenzen benutzt. Heißt das ich kann das jetzt einfach auf Referenzen umbauen?
Schau Dir vorher noch 'Const-Correctness' an und bau dann wenn möglich auf "const &" um.
Es ist wirklich einfach - meistens. Eben da, wo Du mit Referenzen arbeitest, ansonsten müssen es halt Zeiger bleiben.
Glocke hat geschrieben:Xin hat geschrieben:Mit einem Pointer kannst Du mehr machen als mit einer Referenz - wenn Du Du das nicht brauchst, verwende auch wirklich eine Referenz, dann kannst Du dieses Mehr auch nicht versehentlich machen und verhinderst so Fehler.
Was ist denn dieses "mehr" der Pointer gegenüber den Referenzen? Du meinst damit sicher nicht nur dieses "kann-NULL-sein"

Nein, fat-lobyte hat das mit dem dynamic_cast ja bereits gesagt, aber den sollte man hoffentlich in Deinen Quelltexten auch nicht finden.
C-Strings: char const * string solltest Du nicht in char const & wandeln. Hier wird ein Array gemeint und das sollte auch durch den Zeiger (oder []) ausgedrückt werden. Mit einem Array kannst Du den Array-Operator verwenden: string[0], das geht mit einer Referenz nicht. Und Pointer-Arithmetik geht mit Referenzen auch nicht (string++).
Und natürlich, dass Du eine Referenz nicht neu belegen kannst - sie muss direkt in der Initialisierungsliste des Konstruktors belegt werden und die Referenz-Variable ist danach unveränderlich (das bezieht sich nicht auf die Daten, auf die referenziert wird)
Code: Alles auswählen
int a = 1;
int b = 2;
int & ref = a; // <- muss sofort initialisiert werden
ref = b; // a wird zu 2, aber ref referenziert unverändert auf a.
Wenn Du also einen Zeiger brauchst, der mal auf a oder b zeigen können muss, dann brauchst Du wirklich einen Zeiger und keine Referenz.
Re: Referenzen und Zeiger
Verfasst: Do Nov 08, 2012 1:54 pm
von Glocke
Xin hat geschrieben:Schau Dir vorher noch 'Const-Correctness' an und bau dann wenn möglich auf "const &" um.
Es ist wirklich einfach - meistens. Eben da, wo Du mit Referenzen arbeitest, ansonsten müssen es halt Zeiger bleiben.
Vermerkt
Xin hat geschrieben:Nein, fat-lobyte hat das mit dem dynamic_cast ja bereits gesagt, aber den sollte man hoffentlich in Deinen Quelltexten auch nicht finden.
Gibts bei mir gar nicht
Xin hat geschrieben:C-Strings: char const * string solltest Du nicht in char const & wandeln. Hier wird ein Array gemeint und das sollte auch durch den Zeiger (oder []) ausgedrückt werden. Mit einem Array kannst Du den Array-Operator verwenden: string[0], das geht mit einer Referenz nicht. Und Pointer-Arithmetik geht mit Referenzen auch nicht (string++).
Klar
Xin hat geschrieben:Und natürlich, dass Du eine Referenz nicht neu belegen kannst - sie muss direkt in der Initialisierungsliste des Konstruktors belegt werden und die Referenz-Variable ist danach unveränderlich (das bezieht sich nicht auf die Daten, auf die referenziert wird)
Code: Alles auswählen
int a = 1;
int b = 2;
int & ref = a; // <- muss sofort initialisiert werden
ref = b; // a wird zu 2, aber ref referenziert unverändert auf a.
Wenn Du also einen Zeiger brauchst, der mal auf a oder b zeigen können muss, dann brauchst Du wirklich einen Zeiger und keine Referenz.
Das heißt, wenn ich im Konstruktor von Bar bisher einen Pointer (auf ein Objekt der Klasse Foo) verwendet habe (um den Pointer intern in Bar zu speichern) und ich dann für mein Objekt von Bar den Pointer auf Foo verändern will, ich da bei nem Zeiger bleiben muss und keine Referenz nehmen kann?
LG Glocke