반응형
static_cast 필요성
C 언어에서도 type casing 가능하지만
논리적으로 위험한 캐스팅을 대부분 허용해서
개발자 의도 인지 실수 인지 구분하기 어렵다.
[예제 코드]
void* -> 다른 타입으로 캐스팅하는 것은
위험하기 보다 필요한 캐스팅에 해당 하다.
#include <cstdlib>
int main()
{
// C Style
int* p = (int*)malloc(sizeof(int) * 100);
free(p);
}
하지만
int* -> 다른 타입(double*) 캐스팅 하는 것은
4 Byte 할당한 곳에 8Byte 담는 것이기 때문에
의도치 않은 결과를 야기할 수 있다.
int main()
{
int N = 100;
double* p = (double*)&N;
*p = 3.14;
}
static_cast
논리적으로 맞고, 반드시 필요한 경우만 캐스팅 허용
컴파일 타임에 형 변환을 해 주기 때문에
컴파일 시 타입 오류를 잡아 준다
#include <cstdlib>
int main()
{
int* p1 = static_cast<int*>(malloc(100));// ok
free(p1);
int n = 100;
// double* p2 = static_cast<double*>(&n); // error (허용 x)
}
static_cast<바꾸려고 하는 타입>(대상);
• void* -> 다른 타입 포인터 (int*)
• primitive type 간의 값 캐스팅
• 상속 관계 타입 캐스팅
• 사용자 정의 변환 연산자나 변환 생성자
[예제 코드] 상속 관계 타입
#include<iostream>
#include<cstdio>
using namespace std;
class Shape
{
private:
int a;
public:
Shape()
{
a = 10;
}
virtual void draw()
{
cout << "부모 draw" << endl;
}
};
class Triangle : public Shape
{
private:
int a;
public:
Triangle()
{
a = 30;
}
void draw()
{
cout << "자식 draw" << endl;
}
void onlyTriangle()
{
cout << "까망 하르방 고유 함수" << endl;
cout << a << endl;
}
};
int main(void)
{
// upcast
Triangle t;
Shape* ps = static_cast<Shape*>(&t);
ps->draw();
printf("\n-----------------------------------\n\n");
// downcast
Shape s;
Triangle* pt = static_cast<Triangle*>(&s);
pt->draw();
pt->onlyTriangle();
}
자식 클래스를 부모 클래스 타입으로 변수를 담을 수 있다.
부모 클래스를 자식 클래스로도 타입캐스팅을 허용하지만
멤버 함수를 부르면 예상값과 다르게 나올 수 있으니 주의
→ 부모 클래스 인스턴스가 자식멤버함수 호출하면 의도치 않은 결과 초래할 수 있음
반응형
'프로그래밍 언어 > C++' 카테고리의 다른 글
[C++] rvalue reference (4) | 2025.01.27 |
---|---|
[C++] constexpr 키워드 (2) | 2025.01.26 |
[C++] 람다 표현식 lambda expression (2) | 2025.01.25 |
[C++] const_cast 필요성 및 활용 (4) | 2025.01.22 |
[C++] reinterpret_cast 필요성 및 사용 방법 (2) | 2025.01.21 |
댓글