IMHO, 기존 답변은 "이유"를 설명하는 데 실패했습니다. 행동이 유효한지 반복하는 데 너무 많은 초점을 맞추고 있습니다. "액세스 수정자는 객체 수준이 아닌 클래스 수준에서 작동합니다." -그래, 그런데 왜?
여기서 가장 중요한 개념은 원하는 OO 캡슐화를 이해하고 구현을 조정할 권한이있는 클래스를 설계, 작성 및 유지 관리하는 프로그래머 (들)라는 것입니다. 따라서을 작성 class X
하는 경우 개별 X x
객체가 액세스 권한이있는 코드 에서 개별 객체를 사용 하는 방법뿐만 아니라 다음 방법도 인코딩 합니다.
- 파생 클래스는 (선택적으로 순수한 가상 기능 및 / 또는 보호 된 액세스를 통해) 상호 작용할 수 있습니다.
- 고유 한
X
개체가 협력 하여 의도 된 동작을 제공하는 동시에 디자인의 사후 조건과 불변성을 존중합니다.
복사 생성자 뿐만이 아닙니다. 많은 작업이 클래스의 두 개 이상의 인스턴스를 포함 할 수 있습니다. 비교, 추가 / 곱하기 / 나누기, 복사 생성, 복제, 할당 등을 수행하는 경우 종종 해당됩니다. 단순히 다른 개체의 개인 및 / 또는 보호 된 데이터에 대한 액세스 권한이 있거나 더 간단하고 빠르거나 일반적으로 더 나은 기능 구현을 허용하기를 원합니다.
특히, 이러한 작업은 다음과 같은 작업을 수행하기 위해 권한있는 액세스를 활용할 수 있습니다.
- (복사 생성자) 이니셜 라이저 목록에서 "rhs"(오른쪽) 개체의 전용 멤버를 사용하여 멤버 변수가 기본 생성 (적법한 경우라도) 대신 복사 생성 된 다음 다시 할당되도록합니다 (다시, 합법적 인 경우)
- 리소스 공유-파일 핸들, 공유 메모리 세그먼트,
shared_ptr
참조 데이터 등
- 사물의
auto_ptr<>
소유권을 가져옵니다. 예를 들어 소유권을 건설중인 객체로 "이동"합니다.
- 새 개체를 처음부터 다시 생성 할 필요없이 최적으로 사용 가능한 상태로 새 개체를 구성하는 데 필요한 개인 "캐시", 보정 또는 상태 구성원 복사
- 복사 / 액세스 진단 / 추적 정보는 복사되는 객체에 보관되어 있으며 공개 API를 통해 액세스 할 수는 없지만 이후의 예외 객체 또는 로깅에서 사용될 수 있습니다 (예 : "원본"비 복사 구성 인스턴스가 발생하는 시간 / 상황에 대한 정보) 건설되었습니다)
- 일부 데이터의보다 효율적인 복사를 수행합니다. 예를 들어 객체는 예를 들어
unordered_map
멤버를 가질 수 있지만 공개적으로 만 노출 begin()
및 end()
반복자 만 가질 수 있습니다. 직접 액세스하여 더 빠른 복사 를 수행 size()
할 수 reserve
있습니다. 더 나쁜 아직 그들은 단지 노출하는 경우 at()
와 insert()
그렇지 않은 경우와 throw
....
- 클라이언트 코드에 대해 알 수 없거나 쓰기 전용 일 수있는 상위 / 조정 / 관리 개체에 대한 참조를 다시 복사합니다.