static_cast
일반적으로 C/C++ 언어에서는 지정한 데이터형으로 강제 형변환(casting)이 가능하다.
하지만 강제 형변환을 할 경우 원하지 않는 결과가 발생할 수 있으므로, 이런 문제를 미연에 방지하기 위해
static_cast를 사용하며, static_cast는 의미 없는 포인터의 형변환을 막아 준다. 사용 예는 다음과 같다.
#include <stdio.h>
#include <typeinfo>
class T1
{
public:
virtual void print1() { puts( "t1p1" ); }
};
class T2 : public T1
{
public:
virtual void print1() { puts( "t2p1" ); }
virtual void print2() { puts( "t2p2" ); }
};
void main()
{
T1 *t1 = new T1;
T2 *t2 = new T2;
T1 *t;
t = (T1*)t1; // C 언어 스타일의 형변환(casting), 컴파일 에러 없음
t = static_cast<T1*>(t1); // C++ 스타일의 형변환(casting), 컴파일 에러 없음
t = static_cast<T1*>(t2); // Up-casting, 컴파일 에러 없음
t2 = static_cast<T2*>(t1); // Down-casting, 컴파일 에러 없음
int i, *pi;
pi = (int*)&i; // C 언어 스타일의 형변환, 컴파일 에러 없음
pi = static_cast<int*>(&i); // C++ 스타일의 형변환, 컴파일 에러 없음
pi = (int*)t; // C 스타일, 컴파일 에러 없음
pi = static_cast<int*>(t); // C++ 스타일, 컴파일 에러 발생
}
const_cast
상수형 포인터를 비상수형 포인터로 변경하고자 할 때 사용된다. 다음 예를 보자.
#include <stdio.h>
#include <string.h>
void main()
{
char *pc;
const char msg[] = "안눙~";
pc = msg; // 컴파일 에러 발생
pc = const_cast<char*>(msg); // 정상적으로 변환
strcpy( pc, "hello" );
puts( pc );
}
reinterpret_cast
이 연산자는 강제 형변환을 하기 위해 가끔 사용한다. 참고로 강제 형변환은 C 언어 형태를
사용해도 무방하다. 다음 예를 보자.
#include <stdio.h>
#include <string.h>
void main()
{
struct node
{
char a, b, c, d;
};
int ttt = 0x41424344;
node* p1 = (node*)ttt; // C 언어 스타일 형변환
node* p2 = reinterpret_cast<node*>(ttt); // C++ 스타일 형변환
}
'C, C++' 카테고리의 다른 글
1Byte를 2진수로 변경 (0) | 2019.01.23 |
---|---|
inet_addr, inet_ntoa (0) | 2019.01.23 |
클래스를 배열로(class - array) (0) | 2019.01.23 |
더블 포인터란 무엇인가? (double point) (0) | 2019.01.23 |
포인터와 const (0) | 2019.01.23 |