C++中的类型转换

和goto语句一样类型转换的名声似乎也是不那么好。
不过类型转换在某些紧要关头就显得尤为重要,看看现有的C/C++代码就知道,以至于你不理解转换的作用,代码将是无法阅读的。
就像铀,它能变成原子弹,但它也能用来发电,是灾难还是福祉那就要看人类了。
显然类型转换默默承受着这不公的一切。
不管怎么说C风格的类型转换还是不尽人意的:
1.它们很粗糙,你可以通过它们在任意类型之间进行转换,没有明确指定每个转换的目的。
2.C风格的类型转换很难进行查找。它们是由一对括号加上一个类型标识组成的,而括号和类型标识在C++里到处都是。
C++通过引进4种类型的类型转换操作符克服了C风格的类型转换的缺点。
static_cast
const_cast
dynamic_cast
reinterpret_cast
关于这些操作符应该知道的是,你习惯的写法:
(type) expression
现在都应该写成
static_cast<type>(expression)
它与C风格的类型转换有同样的限制,例如不能把结构(struct)转换成int,不能把double转换成指针。
const_cast是用来去掉一个表达式的const属性或者volatile属性(至于volatile在C++中的含义可以google一下便知道)
dynamic_cast用来对一个继承体系做向下或者横向的安全转换,也就是把基类的指针(引用)转换成派生类或者基类的兄弟类指针(引用),很重要的一点可以知道转换是否成功。空指针,异常(引用)意味着转换失败。
dynamic_cast仅限于用来操纵继承体系。而最后一种
reinterpret_cast最常见的用法就是用来在函数指针之间进行类型转换。
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething();
funcPtrArray[0] = &doSomething;//错误,类型不匹配
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
把上面这个函数的指针放入funcPtrArray中,如果不进行类型转换就不可能办到。
C++新的类型转换既难看又难输入(这个很大程度上是设计者故意的,因为可以迫使使用者尽量不进行类型转换),但是C风格的类型转换仍然可用。正因为新的类型转换缺少美感,使得它有着确切的含义并且容易识别。
<<More Effective C++>>的作者Scott Meyers强烈建议使用新的类型转换运算符,这些C++大师的建议应该是值得采纳的。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值