const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别

const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别


     C++是一种强类型语言,对类型的检查非常严格,我们可以使用C语言中的(NewType)Expression来对某个变量或者表达式返回值进行强转,也可以使用C++中提供的新式转换操作符:const_cast,dynamic_cast,reinterpret_cast,static_cast。下面介绍着四种转换使用的不同场景。

一,const_cast

     const_cast顾名思义,用来将对象的常量属性转除,使常量可以被修改。const_cast(varible)中的type必须是指针,引用,或者指向对象类型成员的指针。比如以下用法是错误的:
在这里插入图片描述
     将int改为int&就可以正常编译通过,且输出a值为4:
在这里插入图片描述

二,dynamic_cast

     用来处理一种“安全向下转换”,当我们将父类指针指向一个new出来的子类A对象时,如果该父类有多个不同子类(class A,class B,),那么可以使用dynamic_cast将该指针类型安全转换为A*,如果使用强转操作符或者下面介绍的static_cast,那么将其转换为B*理论上也是可以的,但是使用上就会有错误:比如,类A有的成员函数,类B没有。我们直接看下面这个例子:
在这里插入图片描述
     定义三个类,父类A,子类B和C,B和C中分别有不同的成员函数TestB()和TestC(),然后再用A指针分别指向new出来的A,B,C对象,放入一个数组:
在这里插入图片描述
     遍历数组,将父类指针安全地“向下”转换为每一个子类,并调用不同的子类函数,如果“向下”转换失败,返回是NULL指针。这种场景我了解到的应用最多的是UI界面库中,比如Duilib中,所有控件的父类都是CControlUI,子类控件有CButtonUI,CLabelUI等等,一个布局页面上的所有控件都存在一个CControlUI数组中,遍历该数组取每一个控件的时候,如果涉及到特殊控件的操作,那么需要进行安全转换(虚函数是不需要的),此时就用上了dynamic_cast。
     但是dynamic_cast的执行速度比较耗时,在多重继承中最好不用,使用新的设计模式来替代类型转换,参见在Effective C++的条款28中:尽量避免转型,特别是在注重效率的代码中避免dynamic_cast。如果有个设计需要转型动作,试着尝试用无需转型的替代设计。

三,reinterpret_cast

     是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制类型在底层代码以外应该极为罕见。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。比如下面的这个例子:
在这里插入图片描述
     此时str和p的值是完全相同的,reinterpret_cast的作用是说将指针str的值以二进制的方式解释为整型。
     这种操作,我在实际项目中和从来没有用到过,仅限于书面基础知识的了解。

四,static_cast

     static_cast用来处理隐式转换,等同于C语言中的(NewType)Expression强转,它可以将int转为float,也可以将char转为int,将指向基类的指针转为一个指向子类的指针,同时可以将non-const转为const对象,但是它不能将一个const对象转为non-const(这个是const_cast的功能)。此处就不再举例。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Simple Simple

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值