Zeiger vs. Referenz



  • Hallo,

    ich wollte mal in die Runde fragen, wie ihr allgemein zu Zeigern / Referenzen steht. Was bevorzugt ihr wann und warum? Ich tendiere allgemein zu Referenzen, da sie etwas sicherer und einfacher zu verwenden sind, allerdings kommt man manchmal nicht um Zeiger herum.

    Zugunsten der Konsistenz könnte man aber auch nur auf Zeiger setzen und auf Referenzen ganz verzichten, denn Zeiger haben keinerlei Limiterungen.

    Einen Mischmasch zwischen beiden finde ich am schlimmsten, man (de-)referenziert zwar recht schnell, allerdings muss man dann ständig auf der Hut sein was gerade verlangt wird - und zur Leserlichkeit trägt es auch nicht gerade bei.

    Gibt es da unter C++ Programmierern einen Konsens? Sowas wie "Referenz wenn möglich, Zeiger nur wenn unvermeidbar"?

    MfG,
    Pointee



  • Nimm Referenzen immer da, wo die Variable auf jeden Fall gültig sein muss, während Zeiger dort kommen, wo etwas auch tatsächlich null sein darf:

    void Spaziergang(const Spaziergaenger &spaziergaenger, const Hund *hund);
    

    Der Hund ist optional, daher ein Zeiger, damit wir prüfen können, ob er überhaupt da ist. Der Spaziergänger muss aber immer da sein. Deshalb wird er wie eine ganz normale Variable übergeben.



  • Buggy34242 schrieb:

    void Spaziergang(const Spaziergaenger &spaziergaenger, const Hund *hund);
    

    Der Hund ist optional, daher ein Zeiger, damit wir prüfen können, ob er überhaupt da ist. Der Spaziergänger muss aber immer da sein. Deshalb wird er wie eine ganz normale Variable übergeben.

    Den optionalen Hund würde ich in dem Fall durch Überladung lösen. Normalerweise sollte man möglichst einheitlich Referenzen oder Zeiger benutzen, um den Anwender oder einen selber beim späteren Lesen des Codes nicht zu verwirren.
    Als Funktionsparameter benutze ich daher eher Referenzen, Zeiger bleiben für bestimmte Beziehungen zwischen Klassen und für dynamische Speicherverwaltung vorbehalten.



  • In diesem Forum gibt es zahlreiche Threads, in denen es genau um das geht. Such doch mal kräftig. (Kleiner Tipp: Mit google gehts besser, als mit der Boardsuche..)



  • pumuckl schrieb:

    Buggy34242 schrieb:

    void Spaziergang(const Spaziergaenger &spaziergaenger, const Hund *hund);
    

    Der Hund ist optional, daher ein Zeiger, damit wir prüfen können, ob er überhaupt da ist. Der Spaziergänger muss aber immer da sein. Deshalb wird er wie eine ganz normale Variable übergeben.

    Den optionalen Hund würde ich in dem Fall durch Überladung lösen. Normalerweise sollte man möglichst einheitlich Referenzen oder Zeiger benutzen, um den Anwender oder einen selber beim späteren Lesen des Codes nicht zu verwirren.
    Als Funktionsparameter benutze ich daher eher Referenzen, Zeiger bleiben für bestimmte Beziehungen zwischen Klassen und für dynamische Speicherverwaltung vorbehalten.

    Ich finde die Spaziergang-Funktion sehr gut nachvollziehbar, würde allerdings hund als optionalen Parameter noch 0 setzen. Das dokumentiert die Verwendung einen Tick besser.

    Funktionen zu überladen mit dem einzigen Ziel, für (ansonsten) optionale Parameter Referenzen verwenden zu können, finde ich übertrieben. Die eine Spaziergang-Variante (mit hund = 0) ist für mich lesbar und keineswegs verwirrend.

    Ich neige auch dazu, die Parameter der internen Verwendung anzupassen. Wenn ich intern ohnehin einen Hund* verwende (was ja bei optionalen Parametern nötig ist), nehme ich den Hund auch als Pointer entgegen.

    Stefan.



  • 🙄



  • Ich nehme Zeiger, wenn ich erlauben will, daß der Pointee verändert wird. Wenn nicht, wird's eine Referenz auf const, die fühlt sich genauso an wie eine Wertübergabe.


Anmelden zum Antworten