2010-07-13 4 views
0

Non, il ne s'agit pas de l'erreur que tout le monde commet lors du passage des locaux. J'essaye juste de comprendre en renvoyant une référence à un objet que vous passez (je lis à travers l'amorce).A propos de renvoyer des références à des objets

Donc, si j'ai une fonction comme ceci:

const foo & foo::function2(const foo & val) const 
{ 
    using namespace std; 
    return *this; 
} 

puis je suis dans la principale faisant:

foo object1; 
object1.someproperty = 7; 

foo object2 = object1.function2(object1); 
object2.someproperty = 5; 

cout << &object1 << endl; 
cout << &object2 << endl; 

Quand je reviens par référence, ne devrait pas avoir le même object2 adresse (et propriétés) en tant qu'objet1? Ne devrait-il pas changer «someproperty» dans un objet, changer la valeur dans l'autre? Ou, est-ce que renvoyer une référence à un objet copie simplement les valeurs dans le nouvel objet?

Il semble que la même chose se passe comme si je venais juste de dire que j'allais retourner un objet foo au lieu d'une référence à un objet.

+0

Non, car vous déclarez deux objets différents sur la pile et copiez leurs valeurs. – cpx

Répondre

6
foo object2 = object1.function2(object1); 

function2() renvoie une référence à object1; le constructeur de copie foo est ensuite appelé pour copier object1 dans object2, car object2 est déclaré en tant qu'objet foo.

Si vous avez déclaré object2 comme référence const au lieu:

const foo& object2 = object1.function2(object1); 

alors object2 serait une référence à object1.

+0

Ah ok, il est logique que quelques choses se produisent implicitement sous le capot. Merci à tous pour les réponses très rapides et complètes. – Ilya

0

La ligne de code:

foo object2 = object1.function2(object1); 

fait 2 choses.

  1. une référence (qui se référer à object1) est renvoyé par function2()
  2. l'initialisation de object2 crée une copie de l'objet retourné par function2()
1

Vous avez touché le constructeur de copie automatique lorsque vous affecté au object2. En effet ce qui est arrivé était:

foo object2(object1.function2(object1)); 

Lorsque le constructeur de copie généré automatiquement est la suivante:

class foo { 
public: 
    foo(const foo& other) { 
    //shallow copy other to this 
    } 
} 

Afin d'obtenir le code pour faire ce que vous pensez qu'il devrait faire, vous devez déclarer objet 2 comme Référence const:

const foo& object2 = object1.function2(object1); 
//&object2 == &object1 
Questions connexes