More effective C++ 今日一贴 之C++类型转换[1]

来源:互联网 发布:淘宝众筹如何推广 编辑:程序博客网 时间:2024/04/28 07:54
平常的编程中,当发生类型转换时,首先考虑的恐怕就是 C风格的类型吧.但是C风格的 类型转换确实并不尽如人意.
其一 , 它们太粗鲁了,允许任意类型之间的转换,特别是在多态时,当写过转换以后再次看到写的强制转换时,竟然忘掉了强制转换的目的;
其二,任何两种类型之间的转换都是采用同一种方式,也就是 一对括号家加上一个类型标识符组成,而括号和类型标识在C++里到处都是.这使得即使是回答诸如("这个程序用到类型转换了么?")之类简单的与类型转换相关的问题也非常棘手.
    ([color=Magenta]对于第二点还没有什么实际体会[/color])

于是出现了 4 种新的类型转换操作符 , 开发包出曾经用到过  reinterpret_cast
另外三种为:const_cast  dynamic_cast  static_cast
    书写格式为  static_cast<type>(expression)
1.static_cast      于通用的C风格类型转换,具有同样的能力和含义,同样,它也具有C风格类型转换的限制
  如 : 不能把一个DOUBLE 转换成为一个指针  ;  不能把一个结构体转换成为 INT (这两个我也没有试验过,不过明显可以看出,两种转换都属于字节长度不一致的数据类型之间的转换)

2.const_cast    去除一个对象的const 属性 或者 volatile属性

3. dynamic_cast 专用的类型转换,用来针对一个继承体系做向下或者横向的安全转换.也就是说把指向基类的指针(或引用)转换成指向派生类(或引用)或者基类兄弟类的指针(或引用), 而且能够检测转换是否成功, (这点非常重要)

4.reinterpret_cast 经常用于函数指针之间的转换,而且由转换者自己保证转换的安全.

如 typedef void (*FuncPtr)();
  FuncPtr FuncPtrArray[10];
int doSomeThing();
如果你用  funcPtrArray[0] = &doSomething;  会出现编译错误
reinterpret_cast 可以让你强迫编译器以你的方式来看待问题
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
原创粉丝点击