static_cast,dynamic_cast,const_cast,reinterpret_cast使用总结

来源:互联网 发布:多线程编程demojava 编辑:程序博客网 时间:2024/06/08 16:02

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)

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

阅读全文
0 0