-1
votes

Pourquoi une fonction membre ne peut pas modifier la copie locale de la variable de la fonction principale?

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>

  1. à 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>

  2. 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>

  3. 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 << " ";
    }
    


0 commentaires

3 Réponses :


1
votes

get_name () renvoie une copie du membre. Deux appels différents renvoient deux copies différentes du membre.

Cela entraînera la sortie attendue: xxx

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.

  1. à l'intérieur de la fonction de membre get_name0 () Le vecteur "nom" est une copie locale du membre de données privé "Nom".

    Non. Dans la fonction de membre nom est le membre appelé nom . Ce que vous revenez de la méthode est une copie.

    1. Ajout de l'élément "F0" à l'intérieur de la fonction get_name0 () doit rendre l'objet NP0 à avoir {AB, F0} et elle le fait. Pas de problème ici.

      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).

      1. L'ajout de l'élément "M0" dans la fonction principale doit faire (?) L'objet NP0 doit avoir {AB, F0, M0}, mais il a plutôt {AB, F0, F0}.

        L'objet que vous ajoutez "m0" est parti après cette ligne: xxx

        sa vie terminée. Vous devez bien le voir à nouveau. Le prochain appel à get_name0 () vous donnera une nouvelle copie du membre, après avoir ajouté à nouveau "f0" sur le membre.


1 commentaires

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!



3
votes

Chaque appel à get_name0 ajoutera la valeur f0 au nom nom Vecteur. Puisque vous avez 2 appels à cette fonction, vous obtenez 2 copies de f0 inséré. Notez que l'utilisation de la gamme-for Loop est également un appel à cette fonction.

Cependant, le vecteur renvoyé par get_name0 est un copier du du du du Nom 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: xxx


0 commentaires

1
votes

Votre fonction get_name0 code> retourne par valeur, non par référence, donc dans votre cas, votre xxx pré>

se comporte comme p> xxx pré >

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();


0 commentaires