Zeiger vs. Referenz
-
Hallo liebe Wissende,
ich habe mal eine grundsätzliche Frage: Viele Programmierprobleme kann ich entweder durch den Einsatz von Zeigern oder alternativ mit Referenzen lösen. Gibt es Indikatoren, die mir anzeigen, wann ich was verwenden sollte? Allgemein heißt es ja Referenzen sind sicherer, aber sie behüten mich nicht vor "bösem Code".
Klärt mich bitte auf: Wann setzt ihr Referenzen ein und wann sind Zeiger die bessere Wahl.
Dank und Grüße
-
Ein Zeiger macht dann Sinn, wenn man z.B. eine Funktion auch mit einem NULL-Pointer aufrufen können will.
Ansonsten sollte man Referenzen benutzen.
-
Zu diesem Thema wird ewig diskutiert. Such doch mal mit google oder Sufu danach.
-
Naja, die Frage sollt recht einfach beantwortet sein.
Zeiger wenn Du musst, referenz wenn du kannst

Zeiger statt referenz brauchst du nur bei 2 Dingen,
- NULL wert Indikator, ne Ref kann nie ungueltig sein !
- Kompatiblitaet zu C schnittstellen ...In mancher Literatur liest man , das man fuer polymorphie Zeiger braucht, weiss ned ob das frueher mal aktuell war, aber heutzutage geht das mit referenzen definitiv !
Ciao ...
-
ne Ref kann nie ungueltig sein !
Doch. Ungültig schon, aber initialisiert werden muss die Ref. immer.
Simon
-
Eine ref *darf* AFAIK nie ungültig sein, *kann* aber natürlich.
-
Referenzen sind aber auch eine schöne Coderegel, um Referenzen zu verlangen:
class A { X &xref; };Der Compiler wird mir einen Error melden!
Lässt sich lösen:
class A { X &xref; public: A(X &x) : xref(x) {} };Alleine dadurch, das das Member eine Referenz ist, zwinge ich mich selber und auch Anwender meiner Klasse dazu, ein Objekt zu übergeben.
Bei einem Pointer wird mir der Compiler keinen Error melden:
class A { X *xref; };Ist ja nur "optional" zu initialisieren.
-
HansiHinterseher schrieb:
Referenzen sind aber auch eine schöne Coderegel, um Referenzen zu verlangen:
class A { X &xref; };Der Compiler wird mir einen Error melden!
Lässt sich lösen:
class A { X &xref; public: A(X &x) : xref(x) {} };Alleine dadurch, das das Member eine Referenz ist, zwinge ich mich selber und auch Anwender meiner Klasse dazu, ein Objekt zu übergeben.
Bei einem Pointer wird mir der Compiler keinen Error melden:
class A { X *xref; };Ist ja nur "optional" zu initialisieren.
Häh? Wenn Du folgendes hast:
struct A { A(const B& obj); };zwingst Du den Benutzer auch dazu, ein Objekt zu übergeben.
Selbststruct A { A(B obj); };zwingt ihn dazu. Es darf nur keinen Default-Ctor geben. Die Referenz als Attribut ist überflüssig.
-
Tachyon, mit deinen beiden Versionen kannst du "xref" aber schlecht initialisieren. Bei der zweiten Version würde "xref", wenn du es mit "obj" initialisierst, auf einen Parameter zeigen, der direkt danach vom Stack ist, die Referenz also ungültig.
-
Badestrand schrieb:
Tachyon, mit deinen beiden Versionen kannst du "xref" aber schlecht initialisieren. Bei der zweiten Version würde "xref", wenn du es mit "obj" initialisierst, auf einen Parameter zeigen, der direkt danach vom Stack ist, die Referenz also ungültig.
Sein Post ging doch darum, die Übergabe eines Objekts zu erzwingen. Bei mir gibt es gar kein xref. Ist zum Erzwingen einer Objektübergabe auch nicht notwendig.
Und der einleitende Satz: "Referenzen sind aber auch eine schöne Coderegel, um Referenzen zu verlangen" ist ohnehin selbstbestätigend.
-
Badestrand hat verstanden was ich sagen wollte. Dein Beispiel passt zu meinem garnicht. Wo ist denn deine Member-Referenz?
-
Wichtig sei vielleicht noch erwähnt, dass man Zeiger braucht, um in Listen einzufügen. Das funktioniert mit Referenzen nicht.
-
drakon schrieb:
Wichtig sei vielleicht noch erwähnt, dass man Zeiger braucht, um in Listen einzufügen. Das funktioniert mit Referenzen nicht.
Die Wichtigkeit kann ich nicht erkennen, nicht einmal, was du eigentlich ausdrücken willst.
-
camper schrieb:
drakon schrieb:
Wichtig sei vielleicht noch erwähnt, dass man Zeiger braucht, um in Listen einzufügen. Das funktioniert mit Referenzen nicht.
Die Wichtigkeit kann ich nicht erkennen, nicht einmal, was du eigentlich ausdrücken willst.
Man könnte auf die Idee kommen eine Liste von Referenzen zu erstellen.