2012-10-11 11 views
5

Powiel możliwe:
Class Data Encapsulation(private data) in operator overloadingNaruszenie hermetyzacji?

Proszę spojrzeć na ten przykład.

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; 
} 

W funkcji add(), jestem w stanie uzyskać dostęp do wartości prywatnej członka obj2 kiedy już rzeczywiście nazywa add() w kontekście obj1. Czy to nie jest naruszenie enkapsulacji?

Początkowo myślałem, że kompilator rzuci mi błąd, ale tak się nie stało.

+0

Jeśli chciałbyś, aby kompilator narzekał, dlaczego nie zadeklarować 'add', aby zamiast tego użyć referencji' const'? –

Odpowiedz

7

nr

Encapsulation pracuje w klasie poziomie , a nie na poziomie instancji.

Możesz uzyskać dostęp do prywatnych członków każdej instancji swojej klasy.
Możesz nawet uzyskać dostęp do prywatnych członków zdefiniowanych przez twoją klasę poprzez odniesienie do klasy wywodzącej się z twojej klasy.

2

Nie jest to naruszenie enkapsulacji, ponieważ użytkownik uzyskuje dostęp do zmiennej składowej w metodzie, która należy do tej samej klasy. Jeśli obj2 było odniesieniem do innej klasy, np. YourClass, byłoby to naruszenie, ponieważ uzyskiwałeś dostęp do prywatnego członka innej klasy.