const_cast 예제

Off
Non classé

이 예제에서는 Base에서 파생 및 파생 된 Base로의 변환은 유효하지만 Derived에서 관련이 없는 클래스로의 변환은 허용되지 않습니다. 변동성을 버릴 때 컴파일러에 « 액세스를 다시 정렬할 수 없는 휘발성 변수임에도 불구하고 비휘발성으로 취급하기를 원합니다. » 또는 const_cast를 사용하여 변동성을 추가하여 변수에 휘발성 동작을 추가할 수 있습니다. a =const_cast(p) const. 3) 처음에 const로 선언된 값을 수정하는 것은 정의되지 않은 동작입니다. 프로그램의 출력이 정의되지 않았습니다. 변수 `val`은 const 변수이며 호출 `fun(ptr1)`은 const_cast를 사용하여 `val`을 수정하려고 시도합니다. 5) const_cast는 휘발성 특성을 캐스팅하는 데 사용할 수도 있습니다. 예를 들어 다음 프로그램에서 b1의 형식id는 PVKi(휘발성 및 상수 정수에 대한 포인터)이고 c1의 typeid는 Pi(정수에 대한 포인터)이며 const_cast를 사용하여 다음 변환만 수행할 수 있습니다. 특히 const_cast만이 constness 또는 휘발성을 제거(remove)하는 데 사용될 수 있습니다. 멀리 constness를 캐스팅 할 때, 당신은 아마도 위험한 바다로 모험하고 있습니다. 상수 개체를 변경하기 위한 유일한 합법적인 시나리오는 원래 값이 변경 가능한 양수일 때입니다.

원래 개체가 변경할 수 없는 경우 동작이 정의되지 않습니다. 간단한 예: 1) const_cast를 사용하여 const 멤버 함수 내에서 const 클래스 멤버가 아닌 클래스 멤버를 변경할 수 있습니다. 다음 코드 조각을 고려하십시오. const member function fun() 내부, `this`는 컴파일러에서 `const student* const this`로 처리됩니다. const_cast는 `학생* const this`로 `this` 포인터의 유형을 변경합니다. 따라서 constness를 버리는 것이 안전한 유일한 시간은 참조되는 기본 개체가 비 const로 시작된다는 것을 확신 할 수있는 때입니다. 그러나 실제로는 매우 드뭅니다. 따라서 const_cast를 안전하게 사용할 수 있지만 매일 코딩하는 것을 강력히 권장합니다. 어떤 이유로 그것을 사용 하 여 자신을 발견 하는 경우 (또는 구성을 제거 하기 위해 C 스타일 캐스트를 사용 하 여), 당신은 강하게 왜 그것을 하 고 그것은 안전 인지 질문 해야. const_cast는 포인터 나 참조에서 구성또는 변동성을 제거 할 수 있지만 결과 포인터 또는 참조를 사용하여 constst로 선언 된 개체에 쓰거나 volatile이 선언 된 개체에 액세스하면 정의되지 않은 동작이 호출됩니다. 이것이 필요할 수있는 유일한 상황은 const-correct가 아닌 제 3 자 라이브러리를 사용하는 const-correct 코드를 작성할 때입니다. 이 경우 제 3 자 라이브러리에 대한 비 const 포인터로 전달해야하는 개체에 대한 const 포인터를 찾을 수 있습니다.

주의가 필요한 경우 const_cast를 사용하여 라이브러리를 사용하는 동안 코드의 const 정확성을 유지할 수 있습니다. 그러나 이러한 상황을 병목 현상으로 인해 가능한 한 적도록 해야 합니다. const_cast를 사용하면 실제로 const 개체 또는 실제로 휘발성 개체를 참조하는 비휘발성 형식에 대한 참조 또는 포인터를 참조하는 비 const 형식에 대한 참조 또는 포인터를 형성할 수 있습니다. const 개체가 아닌 액세스 경로를 통해 const 개체를 수정하고 비휘발성 glvalue를 통해 휘발성 개체를 참조하면 정의되지 않은 동작이 발생합니다. 일반적으로 다른 형식 간의 포인터 비교는 정의되지 않습니다. 다음은 포인터 비교를 위해 reinterpret_cast를 사용하는 예제입니다.

Comments are closed.