클래스의 변형을 고려하십시오 A
.
class A {
public:
void Foo() const;
void Moo();
private:
int m_nState; // Could add mutable keyword if desired
int GetState() const { return m_nState; }
void SetState(int val) { m_nState = val; }
};
const A *A1 = new A();
A *A2 = new A();
A1->Foo(); // OK
A2->Foo(); // OK
A1->Moo(); // Error - Not allowed to call non-const function on const object instance
A2->Moo(); // OK
함수 선언에 const
키워드는 함수가 A
의 상태를 수정하지 계약 의무가 컴파일러에 나타냅니다. 따라서 함수를 A::Foo
내에서 호출하거나 멤버 변수의 값을 변경할 수 없습니다. 이 비로서 선언 A::SetState
를 호출 할 수있다
설명하기 푸()const
, A::GetState
const
명시 적 선언되기 때문에 괜찮다. 회원 m_nState
은 키워드 mutable
으로 신고하지 않는 한 변경 될 수 없습니다.
const
의이 사용 예 중 하나는 'getter'함수가 멤버 변수의 값을 얻는 것입니다.
@ 1800 정보 : 변경 될 수 있음을 잊어 버렸습니다!
mutable
키워드는 컴파일러 오류가 발생할 수있는 멤버 변수 수정을 컴파일러에 허용하도록 컴파일러에 지시합니다. 함수가 상태를 수정해야하지만 수정과 관계없이 객체가 논리적으로 일관성이 있다고 간주 될 때 사용됩니다.
위대한 대답 - 정말 분명하고 간결합니다. 내 +1을 얻었다. –