删除文章

确定要删除这篇文章吗?

取消
确定

const_cast、static_cast、reinterpret_cast、dynamic_cast(迁移2010-12-27)

     阅读(664)  2017-01-15 20:16:50

C++语言中这几种转型相信大家并不陌生但是很容易混淆,下面来看下区别和用法。

  • const_cast

    const Person *getEmployee() { ... }
    Person *anEmployee = const_cast<Person *>(getEmployee());
    

    使用const_cast来剥除getEmployee返回类型中的const修饰符。

  • static_cast

    Shape *sp = new Circle;//子类转换为父类不需要说明
    Circle *cp = static_cast<Circle *>(sp);//父类转换为子类要进行显示说明
    

    可以这样说:圆是形状中的一种, 但是形状不一定就是圆的。 注意:如果sp是Shape的其他派生实例,进行Circle *cp = static_cast(sp)转换时就会报错,如果用旧的强制类型转换Circle cp = (Circle)sp,编译器就不会发现这个错误了,所以应该用static_cast进行转换。

  • reinterpret_cast

    reinterpret_caset一般用于指针之间的转换。 对于字节数相同的类型,例如整形和指针型,可以实现完全的按位转换。这意味着你可以把一个整数赋给一个指针,也可以把一个指针转换成整数,也可以实现各种不兼容指针的转换。
    对于字节数不同的类型,这个操作符不能使用。

    例如: int   x   =   reinterpret_cast <int> (3.14);//错误
    double *y; *y = 3.14; int *x = reinterpret_cast<int *>(y);//正确
    

    reinterpret_cast通常只是将基类指针假装成一个派生类指针而不改变其值,而static_cast则将执行正确的地址操作。

  • dynamic_cast

    dynamic_cast通常用于执行从指向基类的指针安全地向下转型为指向派生类的指针。不同于static_cast的是, dynamic_cast仅用于对多态类型进行向下转型(也就是说,被转型的表达式的类型,必须是一个指向带有虚函数的类类型的指针),并且执行运行期检查工作,来判定转型的正确性。这种转型是需要付出代价的而static_cast则不需要。

    const Circle *cp = dynamic_cast<const Circle *>(getNextShape());
    

    如果getNextShape返回一个指向Circle的指针(或者从Circle共有派生的东西,换句话说,一些和Circle之间存在着is-a关系的东西),那么转型就是成功的,并且cp将会指向一个Circle,否则cp将为空。 习惯上,对一个指针进行dynamic_cast等于在说:“这个Shape指针真的指向一个Circle吗?如果不是,我可以处理这种情况”。

文章评论

Keep it simple,stupid
文章数
300
总访问量
444263
今日访问
601
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部