1.static_cast
用来进行比较“自然”和低风险的转换,比如整形和实数型、字符型之间互相转换。用来处理隐式转换,类型C语言的(newType)expression。在相关类型之间的转换中使用,不能在不同类型的指针之间互相转换,也不能用于整型和指针之间的互相转换,也不能用于不同类型的引用之间的转换,但可以在void*与其他指针之间转换。
对类的转换只能转换有继承关系的类。
建议:不建议用于处理指针之间的转换,因为其效率没有reinterpret_cast高。
int a=99; double b=static_cast<double> (a); //用于转换基本类型 class Base{}; class Child:public Base{}; Child c; Base b=static_cast<Base>(c); //具有继承关系的类新之间转换 |
2.reinterpret_cast
属于底层的强制转换,即在底层进行重新解释,用来进行各种不同类型的指针之间的转换、不同类型的引用之间转换、以及指针和能容纳得下指针的整数类型之间的转换。转换的时候,执行的是按位逐个比特拷贝的操作。
使用场景:
- 从指针类型到一个足够大的整数类型
- 从整数类型或者枚举类型到指针类型
- 从一个指向函数的指针到另一个不同类型的指向函数的指针
- 从一个指向对象的指针到另一个不同类型的指向对象的指针
- 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
- 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
double a=1.2; double* p = &a; int* pi = reinterpret_cast<int *> (p); class A{}; class B{}; A* pa = new A; B* pb=reinterpret_cast<B*>(pa); //将pa 转为B long j=reinterpret_cast<long> (pa); //指针转换为整数 |
3.const_cast
用来进行去除const属性的转换。将const引用转换成同类型的非const引用,将const指针转换为同类型的非const指针时用它。const_cast(varible)中varible的type必须是指针或者引用类型,又或者指向对象类型成员的指针。
例子:
#include <iostream> int main(){ const int a =0; const_cast<int>(a) = 5; std::cout << "a : " << a << std::endl; return 0; } |
以上例子会导致编译错误,提示:int which is not a pointer, reference, nor a pointer-to-data-member type
改正:
#include <iostream> int main(){ const int& a =0; const_cast<int&>(a) = 5; std::cout << "a : " << a << std::endl; return 0; } |
4.dynamic_cast
专门用于将多态基类(即含有virtual的类)的指针或引用,强制转换为派生类的指针或引用,而且能够检查转换的安全性。对于不安全的指针转换,转换结果返回NULL。
不能用于将非多态基类的指针或引用,强制转换为派生类的指针或引用。
注意:
- dynamic_cast只能用于含有虚函数的类。
- dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0。
5.总结
- static_cast 用于转换基本类型和具有继承关系的类新之间转换,不建议在指针类型之间转换;
- reinterpret_cast 将一个类型指针转换为另一个类型指针
- const_cast 用于去除指针变量的常(const)属性,将它转换为一个对应指针类型的普通变量,反过来也可以将一个非常量指针转换为一个常量指针变量
- 只能在继承类对象的指针之间或引用之间进行类型转换。
注意:
dynamic_cast在运行时进行,是动态的;其他三种是在编译时,是静态的。