mutable키워드는 관통하는 방법입니다 const당신이 당신의 객체를 통해 드레이프 베일을. const 참조 또는 객체에 대한 포인터가있는 경우 언제 어떻게 표시되는지를 제외하고 는 해당 객체를 수정할 수 없습니다 mutable.
당신과 함께 const참조 또는 포인터 당신이하는 제약이있다 :
- 보이는 데이터 멤버에 대해서만 읽기 권한
- 로 표시된 메소드 만 호출 할 수있는 권한
const.
mutable지금 작성하거나 표시된 일련의 데이터 멤버 수 있도록 예외를 만든다 mutable. 그것은 외부에서 볼 수있는 유일한 차이점입니다.
내부적 const으로 볼 수 있는 메소드는 표시된 데이터 멤버에 쓸 수도 있습니다 mutable. 본질적으로 const 베일은 포괄적으로 관통됩니다. 개념을 mutable파괴하지 않으며 const유용한 특수한 경우에만 사용 되도록하는 것은 API 디자이너의 책임입니다. mutable키워드는 이러한 특별한 경우에 적용됩니다 그것 때문에 명확하게 표시 데이터 멤버를하는 데 도움이됩니다.
실제로 const코드베이스 전체에 강박 적으로 사용할 수 있습니다 (기본적으로 const"질병"으로 코드베이스를 "감염"하려는 경우 ). 이 세계에서 포인터와 참조는 const거의 예외가 없으므로 추론하고 이해하기 쉬운 코드를 생성합니다. 흥미로운 탈선을 보려면 "참조 투명성"을 찾아보십시오.
mutable키워드가 없으면 결국 const_cast다양한 유용한 특수 사례 (캐싱, 참조 횟수 계산, 데이터 디버그 등)를 처리하는 데 사용해야 합니다. 불행히도 API 클라이언트 가 사용중인 객체 의 보호 를 강제로 const_cast파괴 mutable하기 때문에 훨씬 더 파괴적 입니다. 또한이 광범위하게 발생 파괴 : 을 가리키는 const 포인터 또는 참조를 보내고하는 것은 자유롭게 쓰기 눈에 보이는 회원에 대한 액세스를 호출하는 방법을 수 있습니다. 반대로 API 디자이너는 예외에 대해 세분화 된 제어를 수행해야 하며 일반적으로 이러한 예외는 개인 데이터 에서 작동하는 메소드에 숨겨져 있습니다.constconstconst_castmutableconstconst
(NB는 데이터와 메소드 가시성 을 몇 번 언급 합니다 . 여기에서 논의 된 완전히 다른 유형의 객체 보호 인 public 또는 private 또는 protected로 표시된 멤버에 대해 이야기하고 있습니다 .)