c++ - una - public protected private
Con un modificador privado, ¿por qué se puede acceder directamente al miembro en otros objetos? (4)
Buena pregunta. El punto es que la protección en C ++ es a nivel de clase , no a nivel de objeto. Por lo tanto, un método invocado en un objeto puede acceder a miembros privados de cualquier otra instancia de la misma clase.
Esto tiene sentido si considera que la función de protección es permitir que la encapsulación garantice que el autor de una clase pueda crear una clase cohesiva y no tener que protegerse contra el contenido de objetos de modificación de código externo.
Otro pensamiento en cuanto al real "¿por qué?". Considere cómo escribir casi cualquier constructor de copia; desea acceder a la estructura de datos subyacente del original, no a su interfaz presentada.
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 extraño, pero no entiendo por qué a1
y a2
pueden acceder al miembro de datos privado x
?
Cualquier función miembro de la clase, así como los constructores, pueden acceder a los datos privados. Es decir, los miembros privados del objeto de instancia en el que se invoca el método o los miembros privados de otras instancias.
En este caso, es el constructor y otras instancias (es decir, a1, a2).
Respuesta corta : en los métodos de miembro de class A
, se puede acceder a todos los miembros de class A
(objeto / puntero y miembro static
).
A(A a1, A a2)
{
a1.x = 10;
a2.x = 20;
}
Ahora, según tengo entendido, su pregunta es ¿cómo puede un objeto que invocó la llamada al constructor acceder a otras variables de miembros 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.