이 차이가 가장 중요한 C ++에 대해 이야기하겠습니다.
올바르게 알 수 있듯이 불변 은 객체가 생성 된 후에는 전혀 변경 될 수 없음을 의미합니다. 이 생성은 물론 런타임에 발생할 수 있습니다. 즉, const
객체가 반드시 컴파일 타임 상수는 아닙니다. C ++에서 (1)과 (2) 또는 (3)이 충족되면 객체를 변경할 수 없습니다.
멤버 함수에 mutable
의해 변경된 멤버가 선언되지 않았습니다.const
선언 const
const
멤버 함수는 멤버 를 변경하기 위해 자격 const_cast
을 제거 하는 데 사용하지 않습니다.const
그러나 액세스 수정자를 고려할 수도 있습니다. 작업이 내부적으로 인스턴스를 변경하지만 퍼블릭 인터페이스를 통해 관찰 가능한 인스턴스의 상태에 영향을 미치지 않으면 객체는“논리적으로 불변”입니다.
따라서 C ++는 변경 불가능한 객체를 만드는 데 필요한 도구를 제공하지만 C ++의 모든 것과 마찬가지로 도구는 최소한으로 충분하며 실제로 사용하기 위해 부지런해야합니다. 인스턴스 상태는 반드시 인스턴스 멤버 변수에 국한되는 것은 아닙니다. C ++은 참조 투명성을 강화하는 방법을 제공하지 않기 때문에 전역 또는 클래스 상태도 포함 할 수 있습니다.
const
C ++에는 참조와 포인터를 규정하는 또 다른 기능이 있습니다. const
참조 비 참조 할 수 const
개체. 객체가 non-으로 선언 된 경우에만 참조를 const_cast
통해 객체를 변경하는 데 사용 하는 것이 합법적입니다 (일반적으로 필요하거나 권장되지 는 않음) .const
const
int i = 4; // Non-const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Legal.
물론 const
객체 를 변경하는 것은 정의되지 않은 동작입니다 .
const int i = 4; // const object.
const int* p = &i; // const pointer.
*const_cast<int*>(p) = 5; // Illegal.
const
모든 언어에 존재하는 것은 아니며 모든 언어에는 변이성과 불변성이 존재하지 않기 때문에이 언어를 아고 니스트 하게 만드는 것은 적용 할 수 없습니다. 이러한 개념이 적용되는 경우에만 언어에 따라 다릅니다 .