2011-09-13 4 views

답변

23

좋은 질문입니다. 요점은 C++의 보호가 객체 레벨이 아닌 인 클래스 레벨이라는 것입니다. 따라서 한 객체에서 호출되는 메소드는 같은 클래스의 다른 인스턴스의 private 멤버에 액세스 할 수 있습니다.

캡슐화가 클래스의 작성자가 응집력있는 클래스를 작성하고 오브젝트 내용을 수정하는 외부 코드로부터 보호 할 수 없도록 보장하는 보호 역할을하는 경우 이는 의미가 있습니다.

진짜 "왜?"에 대한 또 다른 생각. 거의 모든 복사 생성자를 작성하는 방법을 고려하십시오. 제시된 인터페이스가 아니라 원본의 기본 데이터 구조에 액세스하려고합니다.

+0

'private'은 순전히 클래스 수준에서 작동합니다. 'protected' [does not] (http://stackoverflow.com/questions/3247671/accessing-protected-members-in-a-derived-class-c) – MSalters

+0

@MSalters : 물론 그렇습니다. 클래스의 멤버는 기본 하위 객체 (코드가있는 클래스 유형의 다른 객체) 내의 보호 된 멤버에 액세스 할 수있는 기능을 포함하여 해당 클래스 유형의 다른 객체에 대한 향상된 액세스 권한을 계속 얻습니다. –

+0

C++의 액세스 지정자는 객체가 아닌 _names_에 대한 액세스를 제어합니다. 합법적 인 방법으로 다른 클래스를 참조 할 수 있다면 실제로 다른 클래스의 개인 멤버에 액세스 할 수 있습니다. – bames53

4

클래스의 모든 구성원 함수와 생성자가 개인 데이터에 액세스 할 수 있습니다. 이것은 메서드가 호출 된 인스턴스 개체의 private 멤버이거나 다른 인스턴스의 private 멤버입니다.

이 경우 생성자이고 다른 인스턴스 (즉, a1, a2)입니다.

0

짧은 답변 : class A의 멤버 방법에서, (객체/포인터와 static 회원)의 모든 구성원은 class A에 액세스 할 수 있습니다.

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

제 생각에 여러분은 궁금한 점은 생성자 호출을 호출 한 객체가 다른 클래스 멤버 변수에 액세스 할 수 있는지 여부입니다.

이제 생성자와 인수 a1,a2이 모두 클래스 범위에 포함됩니다. 따라서 액세스 수준에 관계없이 모든 구성원에게 액세스 할 수 있습니다. 이것도 생성자에서 작동합니다 -

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.