天天看点

static_cast,dynamic_cast,const_cast,reinterpret_cast使用总结

1)c++类型转换分为两种:

1, 隐式转换:如int 转float,float转double

2, 显式转换:四种显式转换类型:static_cast,dynamic_cast,const_cast,reinterpret_cast

2)static_cast:

转换格式:static_cast<type_id>(expression)

功能:主要用于非多态类型间的转换,不提供运行时的检查来保证转换的安全性

使用场合:1,基类和子类间指针和引用转换,子->基 安全,基->子不安全需程序员保证;2,基本类型间转换,如int->char,int->enum不安全;3,void*转换为目标类型极其不安全

例子:static_cast<QMouseEvent*>(event);//event QEvent

3)dynamic_cast:

转换格式:dynamic_cast<type_id>(expression) //type_id 和expression类型必须一致,指针不能对应引用

功能:主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

使用场合:上行转换与static_cast功能相同,下行转换具有类型检查的功能,更加安全。

  1. 如果expression是type-id的基类,使用dynamic_cast进行转换时,在运行时就会检查expression是否真正的指向一个type-id类型的对象,如果是,则能进行正确的转换,获得对应的值;否则返回NULL,如果是引用,则在运行时就会抛出异常;

例子:

class A4.如果expression是type-id的基类,使用dynamic_cast进行转换时,在运行时就会检查expression是否真正的指向一个type-id类型的对象,如果是,则能进行正确的转换,获得对应的值;否则返回NULL,如果是引用,则在运行时就会抛出异常;
	{
	public:
	     virtual void f(){}
	     // ......
	};
	class B
	{
	public:
	     virtual void f(){}
	     // ......
	};
	int main()
	{
	     A *pA = new A;
	     B *pB = new B;
	     void *pV = dynamic_cast<void *>(pA); // pV points to an object of A
	     pV = dynamic_cast<void *>(pB); // pV points to an object of B
}      
对于一些复杂的继承关系来说,使用dynamic_cast进行转换是存在一些陷阱的;      
class A
	{
	     virtual void Func() = 0;
	};
	class B : public A
	{
 	    void Func(){};
	};
	class C : public A
	{
 	    void Func(){};
	};
	class D : public B, public C
	{
	     void Func(){}
	};
	int main()
	{
 	     D *pD = new D;
	     A *pA = dynamic_cast<A *>(pD); // You will get a pA which is NULL
	}      
  1. 如果进行上面的直接转,你将会得到一个NULL的pA指针;这是因为,B和C都继承了A,并且都实现了虚函数Func,导致在进行转换时,无法进行抉择应该向哪个A进行转换。正确的做法是:
    int main()
    {
         D *pD = new D;
         B *pB = dynamic_cast<B *>(pD);
         A *pA = dynamic_cast<A *>(pB);
    }      

4)const_cast:

转换格式:const_cast <type-id> (expression)

功能:用来将类型的const、volatile和__unaligned属性移除。常量指针被转换成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然引用原来的对象

使用场合:你不能直接对非指针和非引用的变量使用const_cast操作符去直接移除它的const、volatile和__unaligned属性。

5)  reinterpret_cast

转换格式:reinterpret_cast <type-id> (expression)

允许将任何指针类型转换为其它的指针类型;听起来很强大,但是也很不靠谱。它主要用于将一种数据类型从一种类型转换为另一种类型。它可以将一个指针转换成一个整数,也可以将一个整数转换成一个指针,在实际开发中,先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原来的指针值;特别是开辟了系统全局的内存空间,需要在多个应用程序之间使用时,需要彼此共享,传递这个内存空间的指针时,就可以将指针转换成整数值,得到以后,再将整数值转换成指针,进行对应的操作。