2012-07-12 2 views
8

mutable는 변수const_cast VS mutable? 차이가 있습니까? 나의 이해에서

Class A { 
    void foo() const { 
    m_a = 5; 
} 
mutable int m_a; 
}; 

constness뿐만 아니라 const_cast을 취소 :

void print (char * str) 
{ 
    cout << str << endl; 
} 

int main() { 
    const char * c = "this is a line"; 
    print (const_cast<char *> (c)); 
    return 0; 
} 

그래서, 다른 하나 어떤 변화?

감사합니다.

답변

16

const_cast 개체의 constness를 취소 할 수 없습니다. const_cast액세스 경로에서 오브젝트에 대한 constness 만 제거 할 수 있습니다. W 세스 경로는 오브젝트에 대한 포인터 또는 참조입니다. 액세스 경로에서 constness를 제거하면 오브젝트 자체에는 아무런 영향을 미치지 않습니다. const_cast을 사용하여 액세스 경로의 constness를 제거한 경우에도 여전히 오브젝트를 수정할 권한이 부여되지는 않습니다. 당신이 그것을 할 수 있는지 없는지는 여전히 객체 자체에 달려 있습니다. const 인 경우 수정이 허용되지 않으며 그렇게하려는 경우 정의되지 않은 동작이 발생합니다.

예를 들어

,이 i 실제로 일정하지 않은 객체라는 사실이 const_cast

int i = 5; // non-constant object 
    const int *p = &i; // `p` is a const access path to `i` 

    // Since we know that `i` is not a const, we can remove constness... 
    int *q = const_cast<int *>(p); 
    // ... and legally modify `i` 
    *q = 10; 
    // Now `i` is 10 

위의 법률 및 유효 유일한 이유의 용도를 보여, 우리는 그것에 대해 알고 .

const int j = 5; // constant object 
    const int *p = &j; // `p` is a const access path to `j` 

    int *q = const_cast<int *>(p); // `q` is a non-const access path to `j` 
    *q = 10; // UNDEFINED BEHAVIOR !!! 

C++ 언어가 일정 개체를 수정할 수 없습니다 및 const_cast에 관계없이 사용하는 방법, 여기에 완전히 힘이 : 원래 객체가 정말 일정이었다 있다면, 위의 코드가 정의되지 않은 동작을 생산하는 것

그것.

mutable은 완전히 다른 것입니다. mutable은 포함 된 개체가 const으로 선언 된 경우에도 법적으로 수정할 수있는 데이터 파일을 만듭니다. 이 의미에서 mutable은 [상수의 일부 지정 부분]을 수정할 수있게합니다. 반면에 const_cast은 그렇게 할 수 없습니다.

1

차이점은 의미입니다 - i. 이자형. 동일한 생성 된 코드, 동일한 런타임 결과 (const 네스는 순전히 컴파일 타임 구조입니다.)하지만 두 구조는 약간 다른 의미를 전달합니다.

아이디어는 클래스에있는 변수에 mutable을 사용하지만 개체의 상태를 구성하지 않는 것입니다. 클래식 예제는 blob 객체의 현재 위치입니다. 얼룩에서 탐색하는 것은 문제의 방식으로 얼룩을 "수정"하는 것으로 간주되지 않습니다. mutable을 사용하면 "이 변수는 변경 될 수 있지만 개체는 여전히 동일합니다"라는 말이 있습니다. 이 특정 클래스에 대해 const -ness가 "모든 변수가 고정됨"을 의미하지는 않습니다.

const_cast은 기존의 const 정확성을 위반하고 있다는 뜻입니다. 아마도 const을 존중하지 않는 타사 API (예 : 구식 C 기반 API)로 작업하기 때문일 수 있습니다.

4

차이점은 const_cast은 속이지 만, mutable은 규칙의 예외입니다.

첫 번째 코드에서 m_amutable이며 따라서 const 멤버 함수에서 데이터 멤버를 수정할 수 없다는 규칙은 예외입니다. 두 번째 조각에

const_cast는 속임수를 시도하지만 정말 할 수 없습니다 유형이 변경하면서, 실제 수정 허용되지 않습니다 : 문자열이 진정으로 const입니다. 이를 수정하려고하면 프로그램이 정의되지 않은 동작을 보입니다.

0

간단히 말해서 멤버 변수를 mutable으로 선언하면 다른 특별한 구문없이 해당 클래스의 상수 메소드에서 쓰기 액세스가 가능합니다. 반면에 const_cast은 달리 상수 변수에 대한 쓰기 액세스를 원할 때마다 수행되어야하며 해당 변수는 클래스 멤버 일 필요조차 없습니다.

멤버 변수에 대한 쓰기 액세스를 명시 적으로 허용하지 않으려는 경우 의도 정확도를 명확히 설명하기 만하면 모든 경우에 const 정확성 위반시 const_cast을 사용하는 것이 좋습니다.

const_cast를 사용하여 volatile 수식어를 추가하거나 제거 할 수도 있습니다.