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 디자이너는 예외에 대해 세분화 된 제어를 수행해야 하며 일반적으로 이러한 예외는 개인 데이터 에서 작동하는 메소드에 숨겨져 있습니다.const
const
const_cast
mutable
const
const
(NB는 데이터와 메소드 가시성 을 몇 번 언급 합니다 . 여기에서 논의 된 완전히 다른 유형의 객체 보호 인 public 또는 private 또는 protected로 표시된 멤버에 대해 이야기하고 있습니다 .)