2 votes

C++ - Pourquoi les variables privées d'un objet passé peuvent-elles être directement accessibles dans le constructeur de copie ?

classe IntVec
{
public:
     IntVec();
     IntVec(int siz);
     IntVec(const IntVec& temp);

     ~IntVec();

private:
       int* arr;

       int size;
};

IntVec::IntVec()
{
    size = 2;

    arr = new int[size]; 
}

IntVec::IntVec(int siz)
{
    size = siz;

    arr = new int[size];
}

IntVec::IntVec(const IntVec& temp)
{
    size = temp.size; // Pourquoi cela ne provoque-t-il pas d'erreur ? size est une variable privée de l'objet temp.

    arr = new int[size];

    for (int i = 0; i < size; i++)
    {
        arr[i] = temp.arr[i]; // Pourquoi cela ne provoque-t-il pas d'erreur ? arr est une variable privée de l'objet temp.
    }
}

IntVec::~IntVec()
{
    delete[] arr;
}

int main()
{
    IntVec test1(2);

    cout << test1.size; // Provoque une erreur (comme prévu), car size est privée.
}

Je ne comprends pas pourquoi je peux accéder aux variables size et arr de temp dans le constructeur de copie, alors qu'elles sont des variables privées. Il est logique que j'obtienne une erreur dans main(), mais je ne suis pas sûr de pourquoi je n'obtiens pas d'erreur dans le constructeur de copie.

2voto

doron Points 10296

Cela est dû au fait que public/protected/private se réfèrent à la classe et non à l'objet individuel. Par conséquent, tous les objets dans une classe ainsi que les méthodes statiques peuvent accéder aux éléments internes des uns et des autres.

2voto

R Sahu Points 24027
size = temp.size; // Pourquoi cela ne provoque-t-il pas d'erreur ?  size est une variable privée de l'objet temp.

Vous ne comprenez pas les règles d'accès.

Les règles d'accès ne s'appliquent pas par objet.

Elles s'appliquent aux types et aux fonctions.

Le type de temp est IntVec. Tout membre d'un objet de type IntVec peut être accédé dans n'importe quelle fonction membre de IntVec.

Les fonctions non membres et les fonctions membres d'autres classes ne pourront pas accéder aux membres privés d'un objet de type IntVec.

1voto

vicky Points 149

Les membres privés ont une portée de classe, ce qui signifie qu'ils peuvent être directement utilisés à l'intérieur de la classe. Vous ne pouvez pas utiliser directement les membres privés en dehors de la classe. Comme le constructeur de copie est à l'intérieur de la classe, vous pouvez accéder aux membres privés.

0voto

iBug Points 20818

C'est parce que les spécificateurs d'accès sont efficaces par classe, et non par objet. Ainsi, une méthode de classe peut accéder aux membres privés de n'importe quelle instance de la classe.

Tous les membres d'une classe (corps des fonctions membres, initialiseurs des objets membres, et l'ensemble des définitions de classes imbriquées) ont accès à tous les noms auxquels une classe peut accéder. Une classe locale dans une fonction membre a accès à tous les noms auxquels la fonction membre elle-même peut accéder.

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