Zeiger oder Referenz



  • +Zeiger! -Referenzen... schrieb:

    Ja, wenn du das aber sagst solltest du bedenken das Referenzen nach Zeigern kamen, da viele Leute schlicht zu dumm fuer Zeiger waren.

    Genau. Das hatte garnichts mit der Notwendigkeit zu tun (operator[], Copy-C'tor, ...). Das war nur für die Dummen. Denn alles, was neu erfunden wird ist nur für die Dummen. Autos sind ja auch nur für Leute erfunden worden, die zu dumm sind mit einer Pferdekutsche zu fahren.

    +Zeiger! -Referenzen... schrieb:

    Demnach kann man nach deiner Aussage keine Bibliotheken nutzen die vor Referenzen da waren nur weil man sich vor den wesentlich effektiveren Zeigern scheut.. 😕

    Inwiefern effektiver? Mehr schreibarbeit, weniger Klarheit im Code?

    Ich sag jetzt nix mehr dazu, ich bin froh das ich verstanden hab wo ich Zeiger und wo Referenzen nutze und mir durch Faulheit o.A. nichts versaue, verschlechtere, verlangsamere... :p

    Es ist schön, das du dich selbst verstanden hast, sonst würde ich dich auch sehr bemittleiden.
    Aber wieso ist es Faulheit Referenzen da einzusetzen, wo sie Sinn machen? Wenn ich sicher bin, dass Sie auf ein konkretes Objekt verweisen soll, wo liegt der Vorteil eines Zeigers? Adress-Arithmetik bringt nichts (gibt nur ein Objekt), Möglichkeit auf null zu zeigen Bringt nix (ich weiß, das ein konkretes Objekt vorliegt), Zeiger auf Zeiger bringt nix (ich kann einen Anlegen, aber wozu?).
    Was genau ist in einem solchen Fall der unglaubliche Vorteil des Zeigers? Das ich öfters ein Sternchen Tippen muss, um den Zeiger zu dereferenzieren? Das mir die klare Aussage, dass es sich um ein konkretes Objekt handelt verloren geht und höchstens durch ein (eigentlich überflüssiges) Kommentar wiedergebracht werden könnte?



  • volkard schrieb:

    Walli schrieb:

    Wenn ich befürchte, dass ich den Code später nicht mehr verstehen könnte mache ich einen Kommentar. Wo ist das Problem?

    schau, was kommentare helfen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-121401-and-postdays-is-0-and-postorder-is-asc-and-start-is-30.html

    Ja, das ist schon eine gefährliche Sprache. Da kann man selbst mit Kommentaren Unsinn machen 😃 .

    Btw: Was unterscheidet eigentlich jetzt genau einen Kommentar von deiner Art der Kennzeichnung? Du hast durch die Zeigerlösung ja auch keinen Mehrwert außer dem '&', welches dir anzeigt, dass der übergebene Parameter modifiziert wird.



  • Nach volkard's Modell programmierte String-Funktion:

    #include <string>
    
    using std::string;
    
    void func( string* dest, const string& src ) {
       dest->operator+=( src );
    }
    

    Bzw.:

    void func( string* dest, const string& src ) {
       *dest += src;
    }
    

    Mit Referenzen:

    void func( string& dest, const string& src ) {
       dest += src;
    }
    

    😃



  • Volkard dein Argument gilt aber nur für Objekte die auf dem Stack liegen, sobald ich das Objekt auf dem Heap habe, oder selbst nur nen Zeiger habe, dann ist ein foo( bar ); keine Eindeutigkeit mehr für ein veränderbarer Parameter.

    Und wer ein v.add( f ); schreibt, das v auf f addiert, der gehört kräftig angebrüllt. Wenn auf f was addiert werden soll, dann schreibt man das f.add( v ); und nicht umgekehrt.



  • Natürlich hat man selbst etwas mehr zu schreiben, aber der Aufrufer weißt dann gleich Bescheid.
    Muss er ein '&' schreiben, wird die Methode bestimmt seinen Wert verändern.



  • hehejo schrieb:

    Natürlich hat man selbst etwas mehr zu schreiben, aber der Aufrufer weißt dann gleich Bescheid.
    Muss er ein '&' schreiben, wird die Methode bestimmt seinen Wert verändern.

    Das muss nicht so sein:

    void func( const A* a ) { /* ... */ }
    
    A b;
    
    func( &b ); // !!!!!!!!!!
    


  • Power Off schrieb:

    Nach volkard's Modell programmierte String-Funktion:

    #include <string>
    
    using std::string;
    
    void func( string* dest, const string& src ) {
       dest->operator+=( src );
    }
    

    Bzw.:

    void func( string* dest, const string& src ) {
       *dest += src;
    }
    

    Mit Referenzen:

    void func( string& dest, const string& src ) {
       dest += src;
    }
    

    😃

    zeig auch die aufrufe, damit der sinn erkennbar ist.

    func(&a,b);
    

    a wird offensichtlich verändert und b nicht.
    veränderliche parameter sind eh fast immer mist. also ist das anzuwarnen doch voll klug. so wie auch die lange schreibweise von reinterpret_cast und konsorten absichtlich lang ist.



  • User--- schrieb:

    Und wer ein v.add( f ); schreibt, das v auf f addiert, der gehört kräftig angebrüllt. Wenn auf f was addiert werden soll, dann schreibt man das f.add( v ); und nicht umgekehrt.

    a.print(b) macht was?
    es ist leider die pur virtuelle void print(ostream&), die man braucht, um polymorphe objekte mit op<< auszugeben.
    klar hieß die beim borland ursprünglich printAt, aber heute heißt sie meistens nur print. die namen verschlechtern sich also messbar. hab ich jetzt recht?



  • Walli schrieb:

    Btw: Was unterscheidet eigentlich jetzt genau einen Kommentar von deiner Art der Kennzeichnung? Du hast durch die Zeigerlösung ja auch keinen Mehrwert außer dem '&', welches dir anzeigt, dass der übergebene Parameter modifiziert wird.

    was ist an irgendeinem stil mehr als kommentar, wenn du es ganz eng nimmst?
    das warn-& ist ein wenig mehr als kommentar, weil es im code steht und weil es was wichtiges vermittelt. und bei löschen des & gibts compilerfehler! es ist mehr als nur warnung, es ist ein automatisches verhüterli. kommentare hingegen sind doof und die liest man nicht und sie sind natürlichsprachlich.



  • User--- schrieb:

    Volkard dein Argument gilt aber nur für Objekte die auf dem Stack liegen, sobald ich das Objekt auf dem Heap habe, oder selbst nur nen Zeiger habe, dann ist ein foo( bar ); keine Eindeutigkeit mehr für ein veränderbarer Parameter.

    warum sollte ich nicht

    Student* ps=new Student;
    read(ps);//verändert
    print(*ps);//nicht verändert
    

    schreiben?



  • Mal angenommen du siehst nicht eine Zeile drüber, dass es ein Pointer ist. Schreibst du dann konsequenterweise so was? Oder markierst du deine Pointer immer mit p?

    read(&(*ps));
    


  • Oder markierst du deine Pointer immer mit p?

    Machst du das nicht? Ich markiere die nicht nur, ich baue mir durch Kuerzel sogar noch den Datentyp in den Variablennamen, was meiner Meinung nach seehr sinnvoll ist...



  • Jaja, die Diskussion hatten wir mindestens schon 25 Mal.



  • Walli schrieb:

    Mal angenommen du siehst nicht eine Zeile drüber, dass es ein Pointer ist. Schreibst du dann konsequenterweise so was? Oder markierst du deine Pointer immer mit p?

    read(&(*ps));
    

    ich kann nicht &*ps programmieren. kannst du das?
    natürlich markiere ich meine pointer nicht mehr mit p.
    und ich kenne den typ meiner variablen, weil ich kleine funktionen baue.



  • volkard schrieb:

    Walli schrieb:

    Mal angenommen du siehst nicht eine Zeile drüber, dass es ein Pointer ist. Schreibst du dann konsequenterweise so was? Oder markierst du deine Pointer immer mit p?

    read(&(*ps));
    

    ich kann nicht &*ps programmieren. kannst du das?

    Habs ehrlich gesagt noch nie versucht. Ich schätze mal einfach dass ich es nicht kann 😉 .

    volkard schrieb:

    und ich kenne den typ meiner variablen, weil ich kleine funktionen baue.

    Ich auch. Aber ich verstehe nicht warum du bei deinen übersichtlichen Codes noch Markierungen brauchst. Das Argument warum du nicht mit p deine Pointer markierst sollte doch eigentlich auch bei der Sache mit & in der Parameterübergabe ziehen.



  • Walli schrieb:

    Ich auch. Aber ich verstehe nicht warum du bei deinen übersichtlichen Codes noch Markierungen brauchst.

    sie nehmen mir noch ein wenig denkarbeit ab.

    Das Argument warum du nicht mit p deine Pointer markierst sollte doch eigentlich auch bei der Sache mit & in der Parameterübergabe ziehen.

    nicht ganz. zeiger sehe ich nicht als gefahr an. schreibende (also zerstörende) funktionen schon.



  • Power Off schrieb:

    Das macht nix, weil es einen operator+( const char*, const string& ) gibt, den Volkard ja aufgelistet hat.

    cool gut zu wissen 🙂
    thx volkard



  • Also, dass so endet wollte ich nicht. Nun könnt ihr mir ja mal zum Abschluss sagen, wofür ich am besten Zeiger oder Referenzen verwenden soll.

    mfg Tc++H



  • Tc++H schrieb:

    Also, dass so endet wollte ich nicht. Nun könnt ihr mir ja mal zum Abschluss sagen, wofür ich am besten Zeiger oder Referenzen verwenden soll.

    Wenn man sich denn einig wäre ... 😉



  • Tc++H schrieb:

    Also, dass so endet wollte ich nicht. Nun könnt ihr mir ja mal zum Abschluss sagen, wofür ich am besten Zeiger oder Referenzen verwenden soll.

    mfg Tc++H

    Referenzen


Anmelden zum Antworten