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
를 사용해야 할 수도 있다.
- 써드파티 라이브러리가