Con un modificador privado, ¿por qué se puede acceder directamente al miembro de otros objetos?


Tengo el siguiente código:

class A 
{
private:
    int x;
public:
    A()
    {
        x = 90;
    }
    A(A a1, A a2)
    {
        a1.x = 10;
        a2.x = 20;
    }
    int getX()
    {
        return this->x;
    }
};

Sé que el código puede ser raro, pero no entiendo por qué a1 y a2 pueden acceder a datos privados miembro x?

Author: ipkiss, 2011-09-13

4 answers

Buena pregunta. El punto es que la protección en C++ es nivel de clase, no nivel de objeto. Por lo tanto, un método que se invoca en un objeto puede acceder a miembros privados de cualquier otra instancia de la misma clase.

Esto tiene sentido si ve que el papel de la protección es permitir la encapsulación para garantizar que el escritor de una clase pueda construir una clase cohesiva, y no tener que proteger contra la modificación de código externo del contenido de los objetos.

Otro pensamiento en cuanto al verdadero "¿por qué?". Considerar cómo escribe casi cualquier constructor de copia; desea acceder a la estructura de datos subyacente del original, no a su interfaz presentada.

 25
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-13 04:46:54

Cualquier función miembro de la clase así como los constructores pueden acceder a los datos privados. Estos son los miembros privados del objeto de instancia al que se llama el método o los miembros privados de otras instancias.

En este caso es el constructor y son otras instancias (a saber, a1, a2).

 4
Author: Petar Ivanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-13 04:35:01

Respuesta corta : En los métodos miembros de class A, se puede acceder a todos los miembros de (object/pointer y static member) class A.

 0
Author: iammilind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-13 04:39:21
A(A a1, A a2)
{
    a1.x = 10;
    a2.x = 20;
}

Ahora, desde mi punto de vista, la pregunta es ¿cómo puede un objeto que invoca la llamada del constructor acceder a otras variables miembro de la clase ?

Ahora, tanto el constructor como los argumentos a1,a2 tienen un ámbito de clase. Por lo tanto, puede acceder a todos sus miembros independientemente de su nivel de acceso. Esto también funcionará en el constructor -

this->x = a1.x; // Notice that "this" members can be accessed too.
                // How ever both the member variables are different and are part of
                // different objects.
 0
Author: Mahesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-13 04:50:45