一、static_cast
格式:static_cast < type-id > ( expression )
功能:将表达式expression转换成最终想要的类型type-id类型,由于是非多态的转换,即运行时没有动态的类型检查,所以转换不能保证安全性。《C++Perimer》指明编译器隐式执行的任何类型转化都能通过static_cast 显示完成。因而,static_cast支持两种类型相关的转换。
用途:
(1)基本数据类型的转换,如把int转换为char
(2)基类与派生类的指针或引用的转换:
向上转换:派生类的指针或引用转换成基类,安全
向下转换:基类的指针或引用转换成派生类,不安全
(3)空指针转换成目标类型的空指针
(4)任何类型的表达式转换成void类型。
注意:
(1)static_cast不能转换掉expression的const、volatile、或者__unaligned属性;
(2)static_cast在编译期转换。
实例:
int i;
float f = 10.5;
i = static_cast<int>(f);
cout<<i<<endl;//i=10
二、reinterpret_cast
格式:reinterpret_cast<type-id> (expression)
功能:type-id必须是指针,引用,算术类型,函数指针或成员指针。reinterpret_cast可以将整数转换成指针,也可以将指针转换成整数,与static_cast相反的是,它支持不相关的类型转换。
用途:
(1)从指针类型转换到一个足够大的整数类型;
(2)从整数类型或枚举类型转换到指针类型;
(3)从一个指向函数的指针转换成另一个指向不同函数的指针;
(4)从一个指向对象的指针转换成另一个指向不同对象的指针;
(5)从类函数成员指针转换成另一个指向不同的类函数成员指针。
(6)任意指针之间的转换。
实例:
char *ss = "1234";
int i = reinterpret_cast<int>(ss);
cout << i << endl; //875770417
格式:const_cast<type_id> (expression)
功能:用于修改const或volatile特性。
用途:
(1)常量指针转换成非常量指针,并且依旧指向原来位置
(2)常量引用转换成非常量引用,并且依旧指向原来位置
实例:
const char* p = "Hello World";
char *q = const_cast<char*>(p);
四、dynamic_cast
格式:dynamic_cast<type_id> (expression)
功能:将基类对象的指针或引用转换成继承类对象的指针或引用,因为dynamic_cast是在运行时确定类型的,所以其是安全的转换。比如,基类指针或引用确实指向派生类的对象,经过转换后可得到正确的指针,如果没有,将会得到空指针。将类层次向上转换时与static_cast相同,但当向下转换时,dynamic_cast具有安全检查,比static_cast更安全。
注意:由于是多态类型转换,所以基类必须具有至少一个虚函数。
实例:
class Base
{
public:
virtual int test(){return 0;}
};
class Derived:public Base
{
public:
virtual int test(){return 1;}
};
int main()
{
Base base;
Derived derived;
Base *pB1=new Base;
Base *pB2=new Derived;
Derived* pD1=dynamic_cast<Derived*>(p1);//p1没有真正指向派生类,pD1置为0
Derived* pD2=dynamic_cast<Derived*>(p2); //正确
return 0;
}