fkt (&string) vs fkt (string)



  • Und was genau hab ich da falsch verstanden? Oo



  • Hirn - Gedächtnis? 🙄



  • Es geht nicht darum was "toller" ist. Es gibt da semantische Unterschiede. Eine Wertübergabe ist nunmal etwas anderes als eine Übergabe als Referenz. Beide haben ihr Einsatzgebiet. Soll deine Funktion den Übergebenen String nicht ändern, kannst du ihn entweder als Wert übergeben oder eine konstante Referenz übergeben. Wobei die beiden natürlich auch wieder unterschiedliche Bedeutungen haben. Bei der Wertübergabe wird der Wert in eine neue Variable kopiert (Aufruf des Kopierkonstruktors). Die interne Variable kann ohne Auswirkungen auf den übergebenen Parameter verändert werden. Die konstante Referenz ist nur ein Verweis auf den Parameter. Es darf nicht verändert auf das Objekt zugegriffen werden ,jedenfalls nicht semantisch verändernd. Auf mutable geh ich jetzt mal nicht ein.
    Die Zeigervariante ist in C++ dank Referenzen nicht nötig.

    Gruß
    Don06



  • Naja... Ich weiß, dass es sich bei sehr langen Strings auf jeden Fall lohnt eine Referenz oder einen Pointer zu übergeben anstatt dem String an sich, da er ja kopiert werden müsste (na schön - ab und zu optimiert das wohl der Compiler auch weg, wie ich mir hier schon anhören durfte, aber darum geht es jz nicht...).
    Ich wollte einfach nur wissen, was eben schneller geht - ob es vll irgend ne Grenze gibt, ab wo sich die Referenz oder der Pointer nicht mehr lohnt (mir klar, dass es da keine Grenze gibt, wie ab 63 Zeichen o.ä. aber vll kann mir ja wer bissl was genaueres sagen ^^

    Bye



  • Ich würde alles als Referenz, bzw. wenn NULL als Wert möglich sein soll Zeiger,
    übergeben, außer die Standardtypen wie char,int,float,short...
    double verwende ich praktisch nie, aber das übergäbe ich wieder als Referenz (>4Byte)



  • danke - endlich ma ne antwort, die mir was bringt : > tytytyty ^^



  • unskilled schrieb:

    danke - endlich ma ne antwort, die mir was bringt : > tytytyty ^^

    Ausführliche Zusammenfassung:

    Ohne zulässigen NULL-Wert:
    Verwende sofern der Parameter nicht geändert werden soll bei eingebauten Datentypen Call by Value, bei Objekten Call by "constant" Referenz. Sobald der Parameter aber verändert werden soll: Call by Referenz.

    Mit zulässigen NULL-Wert:
    Grundsätzlich gehen hier nur noch Pointerübergaben. Hier sollte man aber auch alles mit const deklarieren was nicht änderbar ist (Zeigeranteil, Objektanteil). Falls der Zeiger selbst änderbar sein sollte, würde ich ihn lieber per Zeigerreferenz (typ*&) als per Zeiger auf Zeiger (typ**) übergeben, um die Zeigerarithmetik einfacher zu halten.

    cu André



  • Gut - so hatte ich das jetzt auch verstanden, danke noch mal 🙂

    Bye



  • unskilled schrieb:

    RealQuery(const string & const query);
    ...
    string bla("awer");
    RealQuery(bla);
    

    Das wird dir der Compiler um die Ohren schmeißen. Du schreibst sowas wie "eine konstante Referenz auf einen konstanten String" - da aber Referenzen per definition nicht veränderbar sind, ist das zweite const nicht nur überflüssig sondern sogar verboten, weil einfach nicht Sprachbestandteil.



  • Naja - er ignoriert das überflüssige const einfach (und gibt ne Warnung aus, aber compiliert alles so, wie wenn da nur 1 const stehen würde ^^).
    Ansonsten hast du nat. recht


  • Mod

    unskilled schrieb:

    Naja - er ignoriert das überflüssige const einfach (und gibt ne Warnung aus, aber compiliert alles so, wie wenn da nur 1 const stehen würde ^^).
    Ansonsten hast du nat. recht

    cv-qualifizierte Referenzen sind "ill-formed", erfordern also eine Diagnose (nat. darf der Comniler danach machen was er will, eine Warnung genügt, nur hat das Resultat nichts mehr mit Standard-C++ zu tun). Nur wenn die cv-Qualifikation auf ein typedef oder einen Templateparameter erfolgt, der eine Referenz darstellt, wird die Qualifikation ignoriert.


Anmelden zum Antworten