2011-09-13 24 views

Respuesta

23

Buena pregunta. El punto es que la protección en C++ es clase nivel, 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 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 protegerse contra el código externo que modifica los contenidos del objeto.

Otra idea del verdadero "¿por qué?". Considera cómo escribes casi cualquier constructor de copia; desea acceder a la estructura de datos subyacente del original, no a su interfaz presentada.

+0

'private' funciona únicamente a nivel de clase. 'protected' [does not] (http://stackoverflow.com/questions/3247671/accessing-protected-members-in-a-derived-class-c) – MSalters

+0

@MSalters: Claro que sí. Los miembros de una clase todavía obtienen acceso mejorado a otros objetos de ese tipo de clase, incluida la capacidad de acceder a miembros protegidos dentro de subobjetos base (de otros objetos del tipo de clase donde está el código). –

+0

Los especificadores de acceso en C++ regulan el acceso a _names_, no a los objetos. En realidad, es posible acceder a miembros privados de diferentes clases si puede encontrar una forma legal de referirse a ellos. – bames53

4

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

En este caso, es el constructor y sus otras instancias (es decir, a1, a2).

0

Respuesta corta: En los métodos de miembros de class A, todos los miembros de (objeto/puntero y static miembro) class A se puede acceder.

0
A(A a1, A a2) 
{ 
    a1.x = 10; 
    a2.x = 20; 
} 

Ahora, desde mi entendimiento, se pregunta es ¿cómo puede un objeto que invoca la llamada al constructor puede tener acceso a otras variables miembro de 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 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. 
Cuestiones relacionadas