2010-05-28 8 views
3

Discutons ces deux fonctions:La fonction doit renvoyer une référence ou un objet?

  1. complexe & opérateur + = (const T & val);
  2. complexe opérateur + (const T & val);

Où "complexe" est un nom d'une classe qui implémente par exemple une variable complexe.

Ainsi, le premier opérateur renvoie une référence pour pouvoir écrire a + = b + = c (ce qui équivaut à b = b + c; a = a + b;).

Le deuxième opérateur revient et objec (PAS UNE RÉFÉRENCE), être encore capable d'écrire a = b + c + d.

Qui pourrait m'expliquer cette nuance? Quelle est la différence entre renvoyer une référence ou un objet?

Répondre

1

En 1, a + = b, l'opérateur + = modifie a. Par conséquent, il peut renvoyer une référence à lui-même, parce que lui-même est le résultat correct de l'opération.

Cependant, dans 2. un nouvel objet est requis car a + b renvoie quelque chose qui n'est pas a, donc retourner une référence à a ne serait pas correct.

4

Les opérateurs d'affectation prennent en charge de multiples applications au même objet:

(a += b) += c; 

qui ajouteront à la fois b et c-a. Pour que cela fonctionne, a += b doit renvoyer une référence à a. L'opérateur d'addition, cependant, ne l'exige pas, puisque l'expression b + c + d n'a aucun effet secondaire. Seule l'affectation finale à a a un effet secondaire.

1

La nuance est dans les exemples que vous donnez, d'une certaine manière. De l'opérateur +, vous attendez une valeur différente des deux que vous avez commencés: b + c n'est ni b ni c, c'est autre chose. Ainsi, nous ne pouvons pas renvoyer de références à b ou c ... et à court d'allouer un nouvel objet sur la pile, ce seront les deux seuls avec lesquels nous devrons travailler. Nous devons donc retourner une valeur.

Et vous vous êtes déjà expliqué pourquoi l'opérateur + = renvoie ce qu'il fait.

0

Dans le premier cas, vous ajoutez quelque chose à l'objet à gauche, mais la valeur de l'expression est l'objet à gauche. Donc vous retournez quelque chose (généralement la gauche) par référence. Par exemple:

cout << (a+=b) 

Dans le second cas, vous ajoutez deux objets et d'obtenir un troisième objet, et vous pouvez faire ce calcul sur la pile, de sorte que vous retournez un objet réel en termes de valeur plutôt que par référence. Par exemple:

if(...) 
{ 
    T a = b + c; 
    cout << a; 
} 
1

Parce que complex& operator+=(const T& val); fonctionne sur this et parce que complex operator+(const T& val); doit créer un nouvel objet temporaire pour la somme.

Si vous deviez retourner un objet de +=, probablement faire faire ce que vous attendez, mais il pourrait y avoir quelques copies supplémentaires là-bas. Comme vous l'avez mentionné, vous voulez ce comportement si vous souhaitez enchaîner les appels.Si vous avez renvoyé un message temporaire et écrit (a += b) += c, votre ajout de c serait perdu s'il était détruit dans le fichier temporaire.

Si vous deviez renvoyer une référence de +, vous auriez une référence à un temporaire et votre programme aurait un comportement indéfini. Vous pouvez écrire a=b+c+d car b+c crée un b1 temporaire et b1 + d crée un b2 temporaire, qui est ensuite affecté à a.