C++/Study

[C++] C++의 형변환 연산자

MoongStory 2024. 12. 13. 21:17
반응형

1. dynamic_cast<자료형>(변환 대상)

상속관계에 놓여 있는 두 클래스 사이에서 자식 클래스의 포인터 및 참조형 데이터를 기초 클래스의 포인터 및 참조형 데이터로 형 변환하는 경우

class Car
{
	// ...
}

class Truck : public Car
{
	// ...
}

int main(void)
{
	Car *pcar1 = new Truck();
	Truck ptruck1 = dynamic_cast<Truck *>(pcar1); // 컴파일 에러

	Car *pcar2 = new Car();
	Truck *ptruck2 = dynamic_cast(Truck *>(pcar2); // 컴파일 에러

	Truck *ptruck3 = new Truck();
	Car *pcar3 = dynamic_cast<Car *>(ptruck3); // 컴파일 OK

	return 0;
}

 

2. static_cast<자료형>(변환 대상)

상속관계에 놓여있다면 부모, 자식 관계를 따지지 않고 형변환 시켜준다. 다만, 그에 따른 책임은 프로그래머에게 있다.

dynamic_cast의 예제 코드의 컴파일 에러 부분이 전부 정상적으로 형변환이 되어 컴파일이 된다.

하지만,

Car *pcar2 = new Car();
Truck *ptruck2 = dynamic_cast(Truck *>(pcar2);

 

위와 같은 경우 자식 클래스에만 정의된 함수를 호출하거나 하는 경우 결과를 예측할 수 없다.

추가로 C언어에서 사용하던 (int)doubleVariable 같은 형식으 형변환은 static_cast<int>(doubleVariable)로 사용하면 된다.

(모든 경우가 다 되는 것은 아니다. const_cast, reinterpret_cast로만 변환 가능한 경우도 있다.)

3. const_cast<자료형>(변환 대상)

포인터와 참조자의 const 성향을 제거하는 형변환.

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

void showAddResult(int &n1, int &n2)
{
	cout << n1 + n2 << endl;
}

int main(void)
{
	const char *name = "Test Name";
	showString(const_cast<char *>(name));

	const int &num1 = 100;
	const int &num2 = 200;
	showAddResult(const_cast<int &>(num1), const_cast<int &>(num2));

	return 0;
}

 

위와 같이 사용 가능하다. 하지만, const 선언이 '값의 변경을 허용하지 않는다'라는 의미로 사용하기 때문에 그 의미가 무색해지기 때문에

되도록이면 사용하지 않도록 한다.

4. reinterpret_cast<자료형>(변환 대상)

상관없는 자료형의 두 데이터간 형 변환

(포인터를 대상으로 하는, 그리고 포인터와 관련이 있는 모든 유형의 형 변환을 허용)

class AAA {...};
class BBB {...};

int main(void)
{
	AAA *a = new AAA();
	BBB *b = reinterpret_cast<BBB *>(a);
	// ...
}

 

위와 같이 전혀 연관 없는 자료형 간에도 형변환이 된다.

그럼, 어떠한 경우에 사용이 되는걸까...

#include <iostream>

using namespace std;

int main(void)
{
	int num = 0x010203;
	char *ptr = reinterpret_cast<char *>(&num);

	for(int i = 0; i < sizeof(num); i++){
		cout << static_cast<int>(*(ptr + 1)) << endl;
	}

	return 0;
}

 

이처럼 정수형 변수를 char*형으로 형변환 하여 정수형 변수에 1byte 단위로 접근하고자 할 때 사용 할 수 있다.

반응형

'C++ > Study' 카테고리의 다른 글

[C++] 대입 연산자 오버로딩 시 유의점  (0) 2024.12.13
[C++] 클래스 템플릿 기반의 객체 생성  (0) 2024.12.13
[C++] 증감연산자(전위형 후위형)  (0) 2024.12.13
[C++] 함수 오버로딩  (0) 2024.12.13
[C++] namespace  (0) 2024.12.13