2011-04-19 5 views
3
const int a = 1; 
int *p = const_cast<int*>(&a); 
*p = 2; 
cout << “value a=”<< a << endl; 
cout << “value *p=” <<*p << endl; 
cout << “address a=” <<&a << endl; 
cout << “address p=” <<p << endl; 

출력 :C++에 const_cast 질문

value a=1 
value *p=2 
address a=0xbff1d48c 
address p=0xbff1d48c 

왜 ??? 왜 같은 addr, diff 값입니까? 혼란스러워. 감사합니다.

+0

나는 BFF로 시작하는 방식을 좋아합니다. :) – Mehrdad

+0

pedantic-errors는 코드에서이 실수를 포착합니다! –

답변

14

C++ 언어에서는 상수 개체를 수정하려고 시도하지 않습니다. 이러한 시도로 인해 정의되지 않은 동작이 발생합니다.

프로그램에서 *p = 2 지정은 상수 개체 a을 수정하려고 시도합니다. 동작은 정의되지 않습니다. 당신이 관찰하는 이상한 출력은 정확히 정의되지 않은 동작입니다.

정의되지 않은 동작에 대해서는 의미있는 설명이 없습니다.

는 (귀하의 컴파일러는 아마 a의 값이 법적으로 변경할 수 있기 때문이다. 그래서 관계없이 당신이 당신의 a에 무엇의, 1 항상 인쇄됩니다 cout << 1;cout << a; 문을 번역했다.)

+4

실용적인 이유를 추가하려면 : 아마도 const 값은 const이기 때문에 어딘가에 캐싱되었지만 다른 값은 그렇지 않습니다. 따라서 실제 값과 오래된 값이 캐시 된 것을 볼 수 있습니다. (이것은 단지 추측입니다.) –

2

을 AndreyT에 추가 상수를 편집 할 때 정의되지 않은 동작이 발생한다면 왜 const_cast<>이 필요한지 궁금 할 것입니다. const_cast<>은 출생시 쓰기 금지가 아닌 값에 대한 쓰기 권한을 얻기위한 것입니다.. 아래의 변경 사항을 시도해보고 적절한 동작을 제공해야합니다.

int b = 1; // 'b' is modifiable 
const int a = b; 
... 
+0

:) 감사합니다 ~ ~ –

+0

좋은 지적이지만 유일한 것은 아닙니다 (예 :'const_cast <>'도 * const * 자격을 추가하는 데 사용할 수 있습니다). –

+1

@ 토니 : static_cast (따라서 암시 적 캐스트)를 사용하여 자격을 _ const_ 추가 할 수 있습니다. 'const_cast'는 특별히 _remove_ const 자격을 위해 설계되었습니다. –