std::string& vs std::string



  • Hallo zusammen,

    mir ist der Unterschied zwischen folgenden zwei Funktionen noch nicht 100% klar:

    void DoSomething(std::string param) {}
    

    und

    void DoSomething(std::string& param) {}
    

    Beides kann ich wie folgt aufrufen:

    std::string myparam = "test";
    DoSomething(myparam);
    

    Danke für Hilfe



  • Die erstere Version bedeutet: Kopiere den übergebenen String und mache etwas mit der Kopie innerhalb der Funktion. Da innerhalb der Funktion nur die Kopie zugreifbar ist, heißt das, dass der Originalstring auf keinen Fall verändert wird.

    Die zweite Version heißt: kopiere den String nicht sondern übergebe eine Referenz auf das Original in die Funktion. Wenn innerhalb der Funktion etwas mit dieser Referenz veranstaltet wird (z.B. eine Änderung), dann wird dadurch auch das Original geändert. Es gibt keinerlei Garantie, dass der String hinterher noch "test" enthält.

    Die dritte Version, die du noch nicht erwähnt hast:

    void DoSomething(std::string const& param) {}
    

    Heißt: Spare dir die Kopie, sondern übergebe auch hier eine Referenz auf das Original. Da die Referenz allerdings als const definiert wurde, ist garantiert, dass das Original hinerher den gleichen Inhalt hat. Innerhalb der Funktion darf dann mit param nichts gemacht werden, was den String verändert.



  • Hallo!

    Danke für die ausführliche Antwort.

    Noch eine kurze Frage dazu:

    void DoSomething(std::string const& param) {}
    

    ist äquivalent zu

    void DoSomething(const std::string& param) {}
    

    oder?

    Sonst wären alle Unklarheiten beseitigt. Super!



  • ja



  • commu_nicator schrieb:

    H

    void DoSomething(std::string const& param) {}
    

    ist äquivalent zu

    void DoSomething(const std::string& param) {}
    

    oder?

    Ja. Welches von beidem man benutzt ist reine Geschmackssache, macht überhaupt keinen Unterschied. Lesen könne sollte man beides 😉


Anmelden zum Antworten