Quelle est la meilleure façon de rétablir la chaîne en C++?

Ma question est simple: si j'ai un peu de classe Homme et je veux définir une fonction membre qui renvoie nom de l'homme, lequel de ces deux variantes est que je préfère?

Première:

string name();

Deuxième:

void name(/* OUT */ string &name);

La première variante est une sorte de inefficace, car elle rend inutiles les copies (variable locale -> valeur de retour -> variable dans la partie gauche de l'affectation).

La deuxième variante à l'air assez efficace, mais il me fait pleurer à écrire

string name;
john.name(name);

au lieu d'une simple

string name(john.name());

Alors, quelle variante est que je préfère et ce qui est le bon compromis entre l'efficacité et la commodité et la lisibilité?

Merci d'avance.

  • Note de côté, comme name() ressemble à une requête en faire const: string name() const;.
  • Pourquoi le premier const? L'objet retourné finit appartenant au client, et il devrait être libre de faire ce qu'il veut.
  • qui ne fait pas partie de la signature, mais plutôt mon commentaire, c'est follwed par un":".
  • Si c'est juste un simple de lecture de l'accès à un membre correspondant de la variable, un const std::string& pourrait même être une bonne idée.
  • Désolé, ensuite. Dans la police, je suis à l'aide, l' : ne fonctionne pas très bien à tous.
  • Pas habituellement. Elle introduit des questions de durée de vie de la référence, etc. Dans une classe de base, il peut créer de réels problèmes pour la classe dérivée. Sauf si vous voulez réellement à l'appui de code client en se référant à des données internes (et sont prêts à documenter la validité de telles références), il est préférable d'éviter de retourner une référence. (Si la documentation de la fonction ne pas spécifier la durée de vie de la référence, alors je considère le code cassé.)
  • L'une des nombreuses questions sur la RVO: stackoverflow.com/questions/7596183/...
  • Remarque gentille, j'ai l'habitude de le faire. Merci 🙂
  • Laisser fullname() fonction qui colle prénom et nom de l'ensemble et retourne le résultat.

InformationsquelleAutor tonytony | 2012-05-11