在C++中显式转换类型的操作函数有static_cast,reinterpret_cast,const_cast和dynamic_cast,前面三个是在编译时实现,后面一个dynamic_cast是在执行时实现,这些操作函数都是模板函数,
static_cast<new_type>(expression)
reinterpret_cast<new_type>(expression)
const_cast<new_type>(expression)
dynamic_cast<new_type>(expression)
new_type是要转变成的类型,expression是变量,转变后返回新类型的数据
1.reinterpret_cast<new_type>(expression)
该函数是将一个类型的指针转换成另一种类型指针或者是一个整形数,注意expression是指针类型,不能转变非指针变量,这种转换不改变指针变量数据存放的格式.
double *a = 10; int * b = reinterpret_cast<int*>(a); //相当于隐式转换int *b = (int*)a; long c = reinterpret_cast<long>(a); //转变为非指针变量 class A{}; class B{}; A *pA = new A; B *pB = reinterpret_cast<B*>(pA); //转换类指针 //不能用于非指针类型转变 double a = 10; int b = reinterpret_cast<int>(a); //错误的 //不能将const指针转换为void*指针 const int * pa = new int; void * pv = reinterpret_cast<void*>(pa); //错误
2.const_cast<new_type>(expression)
用于去除指针的常量属性,转换为同类型的非常量类型,也可以反过来,将非常量的指针转换为同类型的常量指针,只能对于指针类型!
const int *a = new int; int *b = const_cast<int *>(a); const int * c = const_cast<const int*>(b); //对于非指针变量都无法通过编译 const int a = 10; int b = const_cast<int>(a); //错误 int *c = const_cast<int*>(a); //错误
3.static_cast<new_type>(expression)
用于基本类型之间和具有继承关系的类之间的转换,这种转换会改变变量的内部表示方式,也可以用于指针类型,但不必reinterpret_cast<>()效率高.
int a = 10; double b = static_cast<double>(a); class A{}; class B:public A{}; B b; A a = static_cast<A>(b); //继承的转换
在转换具有继承关系的类对象是指针类型时,存在一定的危险
4.dynamic_cast<new_type>(expression)
这个是在执行的时候才进行类型转换,与其他3个不同之一,只能用于继承类对象指针或引用之间进行类型转换,以及没有继承关系的继承类但被转换类具有虚函数的对象进行转换.
可以判断转换是否成功,对于指针,转换失败,则会返回NULL指针,对于引用,转换失败,则会抛出bad_cast异常.
//对于具有继承关系的 class A{}; class B:public A{}; A *a = new A; B *b = dynamic_cast<B*>(a); if(!b) { cout<< "dynamic_cast转换失败" << endl; } else { cout << "dynamic_cast转换成功" << endl; } A a; B &b = dyamic_cast<B &>(a); //引用转换 class A {virtual void fun(){}}; class B{}; A *a = new A; B *b = dynamic_cast<B*>(a); //接着可以使用if语句判断是否转换成功