형변환은 위험하지만 C스타일의 형변환은 많이 일어난다.
compile 타임에 형변환에 대한 타입 오류를 잡아준다.
암시적인 형 변환static_cast<바꾸려고 하는 타입>(대상);
class A {
};
class B {
};
int main() {
A a;
B* b = (B*)&a;
// 정의 되지 않은 형 변환임.
}
위 코드에서는 정상적으로 컴파일이 된듯 보이지만
static_cast를 이용하여 잘못된 형 변환을 방지 할 수 있다.
B* b = static_cast(B*)&a;
class Test {
public:
explicit Test(int num) {
cout << num << endl;
}
explicit operator bool() const {
return true;
}
};
enum class Type {
A, B, C
};
int main() {
Type type = static_cast<Type>(0);
cout << static_cast<int>(type) << endl;
Test t(10);
bool b = static_cast<bool>(t);
cout << b << endl;
}
0
1
explicit 키워드는 자신이 원하지 않은 형변환이 일어나지 않도록 제한하는 키워드이다.
#include <iostream>
using namespace std;
class Parent {
};
class Child : public Parent {
public:
int num = 10;
};
int main() {
Child c;
Parent& p = c;
Child& c0 = static_cast<Child&>(p);
// 가능하지만 위험한 형변환임.
cout << c0.num << endl;
}
10