String zurück geben



  • Muss man in C++ irgendwas "beachten" bei der Rückgabe eines Strings aus einer Funktion, oder gibt es eine Art und Weise dies besonders richtig zu machen?

    std::string  test(){
    
       std::string buffer("test");
       return buffer;
    }
    

    Wie kann oder sollte man es evtl. mit Referenzen lösen?



  • Bzw... Wann gibt man eine Refernz auf einen String zurück? Ich verstehe das mit den Referenzen nicht ganz... Das ist doch eigentlich nichts anderes als ein Pointer??


  • Mod

    So ist das schon richtig.


  • Mod

    Muss man in C++ irgendwas "beachten" bei der Rückgabe eines Strings aus einer Funktion, oder gibt es eine Art und Weise dies besonders richtig zu machen?

    Nö. Es gibt aber Arten das besonders falsch zu machen.

    Es wird höchstwahrscheinlich sowieso copy-elision (=NRVO) angewandt. Eine Kopie wird damit komplett verhindert. Und wenn das nicht zutrifft wird seit C++11 auch automatisch der String gemoved. Kopiert wird in C++11 also schon rein theoretisch gar nicht, und selbst dieser Move ist auch nur potenziell da.



  • So ist das schon richtig.

    Ok, das beruhigt mich schon mal.

    Wie gesagt, das mit den Refernezen verstehe ich nicht so wirklich. Wann braucht man das, also das eine Funktion eine Referenz auf einen String zurück gibt?



  • Das braucht man kaum jemals.

    Man kann es "misbrauchen", z.B. zur Performance-Optimierung.

    class Foo
    {
    public:
        std::string const& GetName() const;
    
    private:
        std::string m_name;
    };
    

    m_name muss dann net kopiert werden.
    Dafür fängt man sich alle möglichen unerwarteten bzw. unerwünschten Nebeneffekte ein, wenn der Anwender mal nicht nach Schema-F anwendet, sondern etwas "funky" vorgeht.
    => Besser lassen

    Wo man es braucht, ist in Container-Klassen ala std::vector<std::string> . Die implementiert man aber üblicherweise nicht selbst.

    Du kannst also mal davon ausgehen dass, wenn du sowas siehst, jemand entweder versucht hat besondern (=zu) schlau zu sein, oder keine Ahnung hatte, oder beides, oder einfach nur komische Vorstellungen davon hat wie man "es richtig macht".
    Anders gesagt: wenn du sowas siehst, dann wechsle in den super-skeptisch Mode, und geh' davon aus dass die Qualität des Programms das du gerade betrachtest ... zumindest fragwürdig ist.
    So mache ich das 😉



  • Ok, dann werd ich bei sowas in Zukunft den *superskeptismode* einschalten 🙂

    m_name muss dann net kopiert werden.

    Interessehalber trotzdem, wie würde das bei dem Beispiel dann funktionieren?

    Also "ausprogrammiert"

    Man ruft dan GetName mit z.B.: GetName("TEST") auf ?

    was macht GetName dann? Mir leuchtet das nicht so ganz ein , wie die Rückgabe dann aussieht, bzw. wie m_name dann seinen "Wert" bekommt



  • Ach, glaub ich hab das falsch verstanden.

    return m_name , so war das wohl gemeint?



  • stringhelp schrieb:

    return m_name , so war das wohl gemeint?

    Ja, genau 🙂



  • string test(){
       string buffer("test");
       return buffer;
    } 
    
    int main()
    {
      cout << test() << endl;
    }
    

    wenn vor den ersten test() ein '&' steht, wird eine Referenz auf die lokale Var. buffer zurückgegeben (oft keine so gute Idee). Man könnte aber auf die Idee kommen, buffer static zu machen und eine Referenz darauf zurückzugeben.



  • großbuchstaben schrieb:

    Man könnte aber auf die Idee kommen, buffer static zu machen und eine Referenz darauf zurückzugeben.

    Was oft ebenfalls keine so gute Idee ist (nicht reentrant).


  • Mod

    Anders gesagt: wenn du sowas siehst, dann wechsle in den super-skeptisch Mode, und geh' davon aus dass die Qualität des Programms das du gerade betrachtest ... zumindest fragwürdig ist.

    Solltest du nicht durchgehend im super-skeptisch Modus sein? Selbst ein Experte macht Fehler. Einfach anzunehmen dass Code korrekt ist weil er einen guten Gesamteindruck macht ist doch schwachsinnig, oder?



  • Nein, bei jeder Zeile genauestens zu gucken was sie tut und wie sie es tut wäre Schwachsinn. *

    Wenn ich einfach nur ne Stelle suche wo eine Änderung in einem bestehenden Programm, welches bekanntermassen funktioniert, zu machen, dann guck ich nicht jede Zeile auf potentielle Fehler durch.
    Sondern gehe von der allgemeinen Annahme durch dass das Ding schon tut was es tun soll. Anhand der Kommentare, Funktionsnamen, Einrückung etc. die man beim überfliegen so mitkommt kann man ein Programm so ca. 10-100x schneller "abgrasen" als wenn man wirklich den Code lesen würde.

    * Es sei denn man sucht nen Fehler oder so. Ich meine hier klarerweise beim normalen Lesen des Codes.


Anmelden zum Antworten