Retour std::string comme référence const
J'ai un doute sur le retour de std::string comme référence const.
class sample
{
public:
std::string mString;
void Set(const std::string& s)
{
mString = s;
}
std::string Get()
{
return mString;
}
};
Dans l'Ensemble de la fonction je suis de passage le std::string comme const référence, const parce que sa valeur ne change pas à l'intérieur de la fonction.
Et En fonction Get, en fait je suis confondu ici. Retour std::string valeur a plus de sens. Mais je ne suis pas sûr que, par l'adoption de la chaîne comme "const" fait référence tous les avantages. Par returing chaîne de référence permettra d'augmenter la exectuion vitesse, je pense que oui, mais je ne suis pas sûr. Mais de retour en tant que 'const fait tout bénéfice pour cela?
OriginalL'auteur Aneesh Narayanan | 2012-11-22
Vous devez vous connecter pour publier un commentaire.
Retour par référence ou const référence a pas de différence de vitesse - les deux sont très vite qu'ils retournent tout simplement une référence à l'objet original, pas de copie est impliqué.
Un objet retourné par la (non-const) de référence peut être modifié par le biais de cette référence. Dans votre exemple,
mString
est public, de sorte qu'il peut être modifié de toute façon (et directement). Cependant, l'approche habituelle avec les getters et les setters (et la raison principale de leur introduction) est l'encapsulation - vous de ne permettre l'accès à vos données de membres à travers le getter/setter, de sorte que vous pouvez détecter des valeurs non valides d'être ensemble, de répondre aux modifications de la valeur et de simplement garder les détails de mise en œuvre de votre classe caché à l'intérieur. Donc getters normalement de retour en const référence ou par valeur.Toutefois, si vous revenez par référence const, il vous lie à toujours conserver une instance de
std::string
dans votre classe pour sauvegarder la référence. C'est, même si plus tard vous voulez revoir votre classe afin qu'il calcule la chaîne à la volée dans la lecture au lieu de les stocker en interne, vous ne pouvez pas. Vous devez changer votre interface publique en même temps, ce qui peut rompre le code à l'aide de la classe. Par exemple, aussi longtemps que vous le retour par la const-référence, ce qui est parfaitement valide code:Ce code de cours
produire un bancales pointeurplus compiler siGet()
est modifié pour revenir en valeur au lieu de const référence. (merci à Steve Jessop pour corriger moi)Pour résumer, l'approche que je voudrais faire est de faire
mString
privé.Get()
peuvent retourner par valeur ou par la const-référence, en fonction de comment vous êtes certain que vous aurez toujours une chaîne de caractères stockée. La classe devrait alors ressembler à ceci:Merci, j'ai corrigé la réponse.
+1 pour le faire remarquer si vous revenez par référence const, il vous lie à toujours conserver une instance de std::string dans votre classe pour sauvegarder la référence
OriginalL'auteur Angew
Le problème de décider comment retourner un non-trivial objet d'une sorte de récipient est en fait non-négligeable:
const
de référence, car il perdrait la possibilité de faire valoir ses invariants. Clairement, le renvoi d'un objet par des non-const
de référence n'est viable que si l'objet de la fonction membre est appelé est également non-const
.const
référence à un objet permettrait d'éviter le problème avec les invariants mais implique tout de même qu'un objet du type correspondant est effectivement conservées en interne comme un détail d'implémentation.Si vous classe est plus viable monitor vous voulez certainement de retour de l'objet par valeur, parce que sinon, l'objet peut être muté avant que l'appelant avait aucune chance de le copier.
Au fond, le choix est idéal. En cas de doute, retour par valeur, sauf si l'objet est connu pour être cher à copier dans ce cas, je pourrait retour par
const&
.Envisagez-vous de retourner un unique_ptr à la place?
OriginalL'auteur Dietmar Kühl
Les plus courantes chose à faire ici serait de rembourser la valeur comme const référence, vous pouvez utiliser une référence ou une copie de la valeur en tant que de besoin:
Si vous avez vraiment besoin de retourner une copie de la chaîne, alors vous pouvez éviter la copie de la chaîne de valeur de retour, en utilisant des "Le Plus Important Const":
OriginalL'auteur Mark Ingram
Le retourner comme une référence. Si une copie est nécessaire, il peut certainement être effectuée à partir de cette référence.
Si vous voulez que votre chaîne pour être modifié que par l'
Set
méthode, définirGet
commeconst std::string &Get () const { return mString; }
OriginalL'auteur chill