30 votes

valeur de retour de la surcharge de l'opérateur en C ++

J'ai une question sur la valeur de retour de la surcharge d'opérateur en C ++. En règle générale, j'ai trouvé deux cas, un retour par valeur et un retour par référence. Alors, quelle est la règle sous-jacente à cela? Surtout dans le cas où vous pouvez utiliser l'opérateur en continu, comme cout<<x<<y .

Par exemple, lors de l'implémentation d'une opération + "chaîne + (chaîne)". comment renverriez-vous la valeur de retour, par ref ou par val.

41voto

Tyler McHenry Points 35551

Certains opérateurs de retour par valeur, par référence. En général, un opérateur dont le résultat est une nouvelle valeur (tels que +, -, etc) doit retourner à la nouvelle valeur en valeur, et d'un opérateur dont le résultat est une valeur existante, mais modifiées (comme <<, >>, +=, -=, etc), doit retourner une référence à la valeur modifiée.

Par exemple, cout est std::ostream, et l'insertion de données dans le flux de données est une modification de l'opération, afin de mettre en œuvre l' << opérateur à insérer dans un ostream, l'opérateur est défini comme ceci:

std::ostream& operator<< (std::ostream& lhs, const MyType& rhs)
{
  // Do whatever to put the contents of the rhs object into the lhs stream
  return lhs;
}

De cette façon, lorsque vous avez une instruction composée, comme cout << x << y, la sous-expression cout << x est évalué en premier, puis l'expression [result of cout << x ] << y est évaluée. Depuis l'opérateur << sur x renvoie une référence à l' cout, l'expression [result of cout << x ] << y est équivalent à cout << y, comme prévu.

A l'inverse, pour "chaîne + chaîne", le résultat est une nouvelle chaîne (les deux chaînes d'origine sont inchangés), de sorte qu'il doit retourner en valeur (sinon vous seriez de retour d'une référence à un emploi temporaire, ce qui est un comportement indéfini).

3voto

Michael Burr Points 181287

Si vous voulez que votre opérateur de surcharge de se comporter comme l'opérateur, la règle est assez simple; la norme définit exactement comment le haut-opérateurs se comportent et indique si le résultat d'un construit est un rvalue ou lvalue.

La règle que vous devez utiliser est:

  • si l'opérateur renvoie un rvalue alors votre surcharge de renvoyer une référence
  • si les haut-retourne un lvalue alors votre surcharge doit retourner une valeur

Cependant, votre surcharge n'est pas nécessaire de retourner le même genre de résultat que l'intégré, mais c'est ce que vous devriez faire, sauf si vous avez une bonne raison de faire autrement.

Par exemple, KennyTM indiqué dans un commentaire à une autre réponse que le flux des surcharges pour l' << et >> opérateurs de renvoyer une référence à l'opérande de gauche, ce qui n'est pas la façon dont le built-ins de travail. Mais les concepteurs de l'interface de flux ont flux I/O peut être enchaînés.

2voto

Brian R. Bondy Points 141769

Selon l'opérateur, vous devrez peut-être retourner par valeur.

Lorsque les deux peuvent être utilisés, comme dans l'opérateur + =, vous pouvez considérer les éléments suivants:

  • Si vos objets sont immuables, il est probablement préférable de revenir en valeur.
  • Si vos objets sont mutables, il est probablement préférable de revenir par référence.

1voto

thebretness Points 405

Habituellement, vous retournez par référence dans une opération qui modifie la valeur des éléments sur lesquels elle opère, comme = ou += . Toutes les autres opérations sont renvoyées par valeur.

C'est plus une règle d'or, cependant. Vous pouvez concevoir votre opérateur de toute façon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X