De retour de la chaîne, comme tout le monde le dit.
lors de l'acceptation des chaînes en tant que paramètres, je devrais les recevoir comme const std::string&
ou const char*
?
Je dirais de prendre toute const paramètres par référence, sauf s'ils sont assez légers pour prendre de la valeur, ou dans les rares cas où vous avez besoin d'un pointeur null à une entrée valide sens "none of the above". Cette politique n'est pas spécifique à cordes.
Non-const paramètres de référence sont discutables, car à partir du code d'appel (sans une bonne IDE), vous ne pouvez pas voir immédiatement s'ils sont passés par valeur ou par référence, et la différence est importante. Ainsi, le code peut-être pas clair. Pour const params, qui ne s'applique pas. Les personnes lisant le code appelant peut généralement présumer que ce n'est pas leur problème, donc ils vont parfois uniquement besoin de vérifier la signature.
Dans le cas où vous allez prendre une copie de l'argument de la fonction, de votre politique générale devrait être de prendre l'argument par valeur. Alors que vous avez déjà une copie, vous pouvez utiliser, et si vous l'avez copié dans un lieu particulier (comme un membre de données), vous pouvez alors le déplacer (en C++11) ou de swap (en C++03) pour l'obtenir. Cela donne le compilateur la meilleure opportunité pour optimiser les cas où l'appelant passe un objet temporaire.
Pour string
en particulier, ce qui couvre le cas où votre fonction prend un std::string
en valeur, et l'appelant indique que l'argument de l'expression d'un littéral de chaîne ou un char*
pointant vers un nul de terminaison de chaîne. Si vous avez pris un const std::string&
et copié dans la fonction, ce qui aurait pour conséquence la construction de deux chaînes de caractères.