2011-04-09 4 views
3
class Foo 
{ 
public: 
void someFunk(Foo &bar); 
private: 
int a; 
... 
}; 

void Foo::someFunk(Foo &bar) 
{ 
a = bar.a; 
} 

매개 변수로 전달 된 개체가 개인 데이터 멤버에 액세스 할 수있는 것으로 나타났습니다. 왜이 포인터를 볼 수 있지만 매개 변수로 전달 된 객체가 접근자를 호출하면 안됩니까? 나는 이것이 잘못된 것이라고 생각했지만 코드는 나를 위해 컴파일되고있다.클래스 개체가 매개 변수로 전달되어 자신의 전용 멤버에 액세스

+5

Stack Overflow에 대한 질문입니다. 프로그래머는 아닙니다. Stackexchange. – Carson63000

답변

5

공식적인 이유는 무엇인지 모르겠지만 자신의 클래스에 속한 다른 개체의 비공개 멤버에 액세스 할 수 있으면 캡슐화가 중단되지 않으며 추가 커플 링이 생성되지 않습니다.

캡슐화의 요점은 클래스 A의 객체가 클래스 B의 객체의 내부 동작을 알지 않아야하므로 B의 구현이 A에 영향을 미치지 않고 변경 될 수 있다는 것입니다. 그러나 클래스 A의 객체는 정의에 따라 즉, 클래스 A의 다른 객체의 내부 구조입니다. 즉, 두 개의 다른 클래스 간의 결합에 대해 이야기하는 것이 타당하지만 동일한 클래스의 두 객체 사이의 결합에 대해 이야기하는 것은 의미가 없습니다.

같은 수준의 개체의 비공개 멤버에 액세스 할 수 없다면 복사 생성자는 어떻게 구현합니까? 각 공개 멤버를위한 접근자를 가져야 할 것입니다.이 멤버는 public으로 설정하는 것에서 단 한 걸음 거리에 있습니다. 모든 비공개 멤버에 게터를 제공하면 클래스가 불필요하게 커지고 유지 관리가 어려워집니다.

1

언어에 따라 달라집니다 - C# (및 C++이 표시됨) 멤버는 인스턴스가 아닌 클래스에 비공개입니다. Ruby와 같은 다른 언어에서 멤버는 인스턴스에만 액세스 할 수 있습니다.

3

private의 정의는 개체가 아니라 클래스에 비공개임을 의미합니다. 클래스의 모든 객체는 다른 클래스 객체의 멤버에 액세스 할 수 있습니다. 이는 예를 들어 복사 생성자를 구현하는 데 필수적입니다.

+0

글쎄, 당신은 항상 접근자를 쓰고 사용할 수 있지만, 그것은 번거 로움이 될 것입니다. – Xeo

+0

@Xeo뿐 아니라 액세스 보호의 목적을 상실합니다. 본질적으로 모든 데이터 회원은 공개적으로 읽을 수 있습니다. – Dima

+1

@Dima : 하, 충분 해. 하나는 인스턴스 - 개인과 클래스 - 개인을 구별해야합니다. 뭐라구? :피 – Xeo

관련 문제