- reinterpret_cast
reinterpret_cast<new type>(expression)
将一个类型的指针转换为另一个类型的指针,它允许从一个指针转换为整数类型。
void test01() {
char a = 0;
int* p = reinterpret_cast<int*>(&a);
//不安全
}
- const_cast
常量const指针与普通指针之间的相互转化。
如果不用const_cast:一般编译器直接报错。
用const_cast之后
void test02() {
const int a = 4;
int b = 10;
//int* p = &a;
int* p = const_cast<int*>(&a);//可以强制转换,但很危险
cout<<--p; //可以直接打印出地址;
*p = b; //直接抛出异常并中止程序。
}
可见还是很危险的。语法生成的时候虽然没报错,但运行说不定就会出错。
- static_cast
主要用于基本类型之间的相互转换,和具有继承关系间的类型转换。
一般情况下的基类指针或引用指向子类时
用static_cast强制转换。
void test03() {
A a;
//B& p = a;
B& p = static_cast<B&>(a);
//可以这样转,但是也比较危险
}
- dynamic_cast
只有类中有虚函数才能用dynamic_cast
dynamic_cast具有类型检查功能,比static_cast更安全
void test04() {
try {
A a;
B& p = dynamic_cast<B&>(a);
}
catch (bad_cast err) {
cout << err.what() << endl;
}
}
结果出现Bad dynamic_cast;
总结:C++中提供的四种强制类型转换在一定的特殊情况下可以使用,但各有各的危险。
但,在C++中可以自己实现 自定义转换函数。
下篇更新自定义转换函数