类型转换

本文详细解析了 C++ 中的四种新式类型转换:const_cast、dynamic_cast、reinterpret_cast 和 static_cast 的功能与使用场景。特别强调了它们在类继承结构中的应用以及可能带来的性能与安全问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

旧式转型:--- 可以替换除dynamic_cast之外的那三种强制转换。

        1)C风格的转型动作

        2)函数风格的。。。

新式转型:

         1)const_cast

                         唯一一个可以将const转为non-const的转换。

                        const_cast只用于类型转换掉表达式的const或volatileness属性。    

                        到目前为止,const_cast最普通的用途就是转换掉对象的const属性

                        对一个const对象采用此方式,其实行为不确定。

                        用于修饰某个非const常量,但此变量不经常使用,可以使用const修饰,用的时候再去除const属性;

         2)dynamic_cast (只用于有继承关系的情况)

                         唯一无法由旧式语法执行的动作;

                         可能消耗重大运行成本的转型动作。效率低下!!!

                         可以用"virtual函数多态"等方式替代强制转换。

                         只能对指针或引用做强制类型转换,对类无法做此动作;

                        你能用dynamic_cast把“指向基类的指针或引用”转换成“指向其派生类或其兄弟类的指针或引用”,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常bad_cast(当对引用进行类型转换时)

                       dynamic_casts在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上-------如果基类没有虚函数,对基类指针或基类引用使用dynamic_cast会编译失败。

         3)reinterpret_cast

                        使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。

                         reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。

                        低级转型,实际动作可能取决于编译器,不可移植。

                        转换函数指针的代码是不可移植的(C++不保证所有的函数指针都被用一样的方法表示),在一些情况下这样的转换会产生不正确的结果(参见条款M31),所以你应该避免转换函数指针类型,除非你处于着背水一战和尖刀架喉的危急时刻。一把锋利的刀。一把非常锋利的刀。

          4)static_cast

                         强迫隐式转换

                        你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型

                        只有可以隐式转换时才成功,否则失败;(如两个不相干的类之间就会失败)

①用于类层次结构中基类和子类之间指针或引用的转换。

  进行上行转换(把子类的指针或引用转换成基类表示)是安全的;------------如果有多个基类,不同类型则得到不同的结果。

  进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。

②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。

③把空指针转换成目标类型的空指针。

④把任何类型的表达式转换成void类型。

注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。


          强制转换可能会创建一个临时变量:

          如static_cast <Window> (* this).onResize();  这时,实际static_cast <Window> (* this)操作创建了一个Window类型的临时副本,对这个副本执行onResize函数; 如果想在this对象上执行onResize动作,直接使用 Window::onResize(); 

          如果不想产生临时变量,则使用static_cast <Window &>方式来强制转换!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值