J'essaie de comprendre comment une fonction de membre d'une classe se comporte lors de la création d'une copie locale de la variable privée. (Pas lors de l'accès à celui-ci par référence)
Donc, j'ai donc ce code et ma compréhension est ceci: p>
à l'intérieur de la fonction de membre get_name0 () Le vecteur "nom" est une copie locale du membre de données privé "Nom". P> LI>
Ajout de l'élément "F0" à l'intérieur de la fonction get_Name0 () doit rendre l'objet NP0 à avoir {AB, F0} et cela le fait. Pas de problème ici. P> li>
Ajout de l'élément "M0" dans la fonction principale doit faire (?) L'objet NP0 doit avoir {AB, F0, M0}, mais il a {AB, F0, F0}. Je ne comprends pas pourquoi cela se produit et je me trompe probablement quelque part? p> li> ol>
Merci d'avance à quiconque clarifie cela pour moi! P>
class Name_pairs { public: vector<string> get_name0() // this is a member function that returns a copy; name is a local copy { name.push_back("f0"); // the copy can be changed by the member function return name; } private: vector<string> name = {"ab"}; }; int main() { Name_pairs np0; np0.get_name0().push_back("m0"); // this should change the local copy not the "name" object but it doesn't cout << "\nnp0 object: "; for (string s : np0.get_name0()) // this should print the local copy from the inside of get_name0() function cout << s << " "; }
3 Réponses :
Cela entraînera la sortie attendue: p> dans votre code il n'y a pas de "copie locale". Le vecteur renvoyé est un temporaire qui cesse d'exister à la fin de la déclaration. P> Non. Dans la fonction de membre Aucun problème ici, mais vous ajoutez au membre, pas à une "copie locale". Vous ajoutez d'abord puis copiez (et renvoyez la copie de la méthode). P> L'objet que vous ajoutez sa vie terminée. Vous devez bien le voir à nouveau. Le prochain appel à get_name () code> renvoie une copie du membre. Deux appels différents renvoient deux copies différentes du membre.
nom code> est le membre appelé
nom code>. Ce que vous revenez de la méthode est une copie. P>
"m0" code> est parti après cette ligne: p>
get_name0 () code> vous donnera une nouvelle copie du membre, après avoir ajouté à nouveau
"f0" code> sur le membre. P> p>
Merci idclev! Maintenant, je comprends mon erreur ... au lieu d'imprimer le nouveau "nom" J'imprimais un autre appel à np0.get_name0 (), qui est une nouvelle copie, comme si vous avez dit ... et merci de corriger ma compréhension de ce que signifie retourner une copie!
Chaque appel à Cependant, le vecteur renvoyé par get_name0 code> ajoutera la valeur
f0 code> au nom
nom code> Vecteur. Puisque vous avez 2 appels à cette fonction, vous obtenez 2 copies de
f0 code> inséré. Notez que l'utilisation de la gamme-for Loop est également un appel à cette fonction.
get_name0 code> est un copier em> du
du
du
du
Nom code> Vecteur, Ajout d'un élément à cette copie ne changera pas la variable de membre. Si vous souhaitez modifier réellement le membre, vous devez renvoyer le vecteur de référence, comme celui-ci: p>
Votre fonction se comporte comme p> Votre get_name0 code> retourne par valeur, non par référence, donc dans votre cas, votre
push_back ("M0"); code> ne modifie que le vecteur temporaire, pas le vecteur code> stocké dans
np0 code>. Si vous souhaitez modifier le
Vecteur code> IND
NP0 code>, puis
get_name0 code> doit renvoyer par référence. P>
const vector<string>& get_name0();