C++的类型转换函数
reinterpret_cast、const_cast、static_cast和dynamic_cast 前三个类型转换是在编译时实现转换,dynamic_cast是在运行时进行类型转换的。
reinterpret_cast<new type>(expression)
const_cast< new type>( expression)
static_cast<new type>(expression)
dynamic_cast<newtype>(expression)
1、reinterpret_cast
reinterpret_cast将一个类型的指针转换为另一个类型的指针,它也允许从一个指针转换为整数类型。这种转换不用修改指针变量值数据存放格式(不改变指针变量),而是在编译时重新解释指针的类型(操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换)。但不能用于非指针类型的转换。
(1)转换一个指针为其它类型的指针,能够在非相关的类型之间转换
class A {};
class B {};
A * a = new A;
B * b = reinterpret_cast<B *>(a);
(2)不能将const指针转换为非const
const int* point =&j;
dm =reinterpret_cast<double*>(point);
(3)不能用于非指针类型的转换
int i; double j = 2.1;
j =reinterpret_cast<int>(j);
(4)可以将一段buffer转成一个类的对象指针,或者反过来。
class A;
A a;
char* pBuffer = reinterpret_cast<char*> (&a);
2、const_cast
const_cast用于const指针与普通指针间的相互转换(将一个const指针转换为对应指针类型的普通指针变量,也可以将一个普通指针变量转换为一个const指针)。不能将非常量指针变量转换为普通变量(从const转为非const,或者volatile转为非volatile)。
class C {};
const C *a = new C;
C *b = const_cast<C *>(a);
3、static_cast
static_cast主要用于基本类型间的相互转换,和具有继承关系间的类型转换(将子类类型的指针转换为父类类型的指针,也能够转换父类类型的指针为它的子类类型的指针)。
(1)用于替代C风格的显式转换和各种类型指针到void*的转换
long b = (int) a;
long b =static_cast<int>(a);
(2)用于父类到子类指针的转换
(3)不能在类层次外转换,所以static_cast比C方式转换安全。
float x;
Count<<static_cast<int>(x);//把x作为整型值输出
4、dynamic_cast
dynamic_cast只能在继承类对象的指针之间或引用的相互转换,在运行时动态转换。只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程,会检查操作是否有效。指针间转换失败可以通过判断是否为null来判断,引用转换失败则抛出 bad_cast 异常。
(1)只有类中含有虚函数才能用dynamic_cast,因其是依赖于VTable来工作的。
(2)用于多态类型的转换,比如从父类到子类的转换。
(3)当明确知道子类的类型时,可用static_cast转换,其效率高点。
class Car;
classCabriolet:public Car{};
classLimousline:public Car{};
voidf(Car *cp)
{
Cabriolet*p = dynamic_cast< Cabriolet > cp;
}