Item 27 强制类型转换

● C++中可使用两种旧式风格的类型转换:
1> (T) expression    C风格
2> T(expression)    函数风格

● C++也提供了新式风格的类型转换:
1> const_cast<T>(expression)        去掉对象的常量属性
2> dynamic_cast<T>(expression)        向下安全的类型转换
3> reinterpret_cast<T>(expression)    低级操作,因为依赖实现所以无法移植
4> static_cast<T>(expression)        强制的隐式类型转换:non-const -> const、int <-> double、void* ptr -> typed ptr、base ptr -> derived ptr

● 类型转换会生成代码,无论是显式的cast语句,还是隐式的编译器行为。

 

 

因为在大多数的计算机体系里,int和double的表示是不同的,所以这里的类型转换会生成相关的代码,然后再执行浮点数除法。

 

 

这是把派生类对象的指针,隐式类型转换为基类指针。其实有时二者的值是不一样的。这时,就要加一些偏移量才能得到基类指针。换言之,一个对象会有多个地址。这和C、Java、C#都不同。
如果使用多重继承,这种情况一定发生;单重继承时也可能发生。而且,这种情况是随编译器而变化的,不是常常发生。
所以,类型转换不能太随便。把对象地址转成char*,对指针进行数学运算,都非常可能会产生未定义行为。

 

● 看上去正确的未必正确

 

 

程序中的static_cast并没有调用*this的onResize函数,而是创建了一个临时拷贝,然后调用了该拷贝的onResize函数。用旧式风格类型转换,结果也一样。
应该修改为:

 

 

● dynamic_cast运行时消耗很大,尽量避免。下面的编程风格尤其要避免:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值