Language/C++

[C++] 27.Unmanaged Programming: const_cast

coco_daddy 2024. 1. 30. 15:15

const_cast

  • const_cast의 사용은 피하는 것이 좋다.
// C style

void Foo(const Animal *ptr)
{
    Animal *animal = (Animal*)ptr;
    animal->SetAge(5);
}
// C++ style

void Foo(const Animal *ptr)
{
    Animal *animal = const_cast<Animal *>(ptr);
    animal->SetAge(5);
}
  • const_cast는 자료형을 바꿀 수 없으며, 오로지 const 또는 volatile 어트리뷰트를 제거할 때 사용된다.
Animal *myPet = new Cat(2, "Coco");
const Animal *petPtr = myPet;

// C style
Animal *myAnimal1 = (Animal*)petPtr; // OK
Cat *myCat1 = (Cat*)petPtr; // OK

// C++ style
Animal *myAnimal2 = const_cast<Animal*>(petPtr); // OK
Cat *myCat2 = const_cast<Cat*>(petPtr); // 컴파일 에러
  • const_cast는 값을 변경하려는 의도를 명확하게 밝히는 캐스팅 방식이지만, 값은 언제나 복사되므로 주의가 필요하다.
  • const_cast를 코드에서 쓰려고 한다면 무언가 잘못 하고 있는 것이다!
void Foo(const char *name)
{
    char *str = const_cast<char *>(name);
    *str = 'p';
}
  • const_cast를 사용할 때 주의할 점은 다음과 같다.
    • 써드파티 라이브러리가 const를 제대로 사용하지 않을 때, 우리 프로그램에서 수정이 불가능한 외부 라이브러리가 const를 제대로 처리하지 않으면 해당 라이브러리를 사용할 때 const_cast를 사용해야 할 수도 있다.