2012-10-11 15 views
5

Duplicar posible:
Class Data Encapsulation(private data) in operator overloadingViolación de la encapsulación?

favor vistazo a este ejemplo.

class myClass { 
    int a; 
public : 
    myClass() { 
    this->a = 0; 
    } 

    myClass(int val) { 
    this->a = val; 
    } 

    void add(myClass &obj2) { 
    cout << "Result = " << this->a + obj2.a; 
    obj2.a = 0; 
    } 

    void show() { 
    cout << "a = " << this->a; 
    } 
}; 

int main() { 
    myClass obj1(10), obj2(20); 

    obj2.show(); //prints 20. 
    obj1.add(obj2); 
    obj2.show(); //prints 0. 

    return 0; 
} 

En la función add(), estoy en condiciones de acceder al valor de un miembro privado de obj2 cuando en realidad, he llamado add() en el contexto de obj1. ¿No es esto una violación de la encapsulación?

Al principio estaba pensando que el compilador me arrojaría un error, pero no fue así.

+0

Si desea que el compilador se queje, ¿por qué no declarar 'add' para tomar una referencia' const' en su lugar? –

Respuesta

7

encapsulación funciona a nivel de clase , no a nivel de instancia.

Puede acceder a miembros privados de cualquier instancia de su clase.
Incluso puede acceder a miembros privados definidos por su clase a través de una referencia a una clase derivada de su clase.

2

Esto no es una violación de la encapsulación porque está accediendo a una variable miembro en un método que pertenece a la misma clase. Si obj2 fuera una referencia de otra clase, por ejemplo, tu Clase, entonces sería una violación ya que estás accediendo a un miembro privado de otra clase.

Cuestiones relacionadas