2012-10-11 5 views
5

가능한 중복 :
Class Data Encapsulation(private data) in operator overloading캡슐화 위반?

이 예제를보고하십시오. 추가() 함수에서

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

, 난 실제로으로 obj1의 맥락에서 추가()를 호출 한 경우가 obj2의 개인 멤버의 값에 액세스 할 수있게되었습니다. 이것은 캡슐화에 위배되지 않습니까?

처음에는 컴파일러에서 오류가 발생한다고 생각했지만 실제로는 그렇지 않았습니다.

+0

컴파일러에서 불평을 원한다면 대신'const' 레퍼런스를 사용하기 위해'add'를 선언하지 않으시겠습니까? –

답변

7

번호

캡슐화는 인스턴스 수준의 클래스 수준에서 작동합니다.

클래스의 모든 인스턴스의 비공개 멤버에 액세스 할 수 있습니다.
클래스에서 파생 된 클래스에 대한 참조를 통해 클래스에서 정의한 전용 멤버에 액세스 할 수도 있습니다.

2

동일한 클래스에 속하는 메소드의 멤버 변수에 액세스하고 있기 때문에 이것은 캡슐화에 위배되지 않습니다. obj2가 yourClass와 같은 다른 클래스의 참조 인 경우 다른 클래스의 비공개 멤버에 액세스 할 때 위반이됩니다.