首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > 编程交流与学习--More Effective C++的学习-Item M2:尽量使用C++风格的类型转换
【标  题】:编程交流与学习--More Effective C++的学习-Item M2:尽量使用C++风格的类型转换
【关键字】:--More,Effective,C++,-Item,M2,C++
【来  源】:http://blog.csdn.net/swordll80/archive/2006/09/17/1233096.aspx

编程交流与学习--More Effective C++的学习-Item M2:尽量使用C++风格的类型转换

C风格的类型转换:一来它们过于粗鲁,能允许你在任何类型之间进行转换。不过如果要进行更精确的类型转换,这会是一个优点。二来C风格的类型转换在程序语句中难以识别。

C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点, static_cast, const_cast, dynamic_cast, reinterpret_cast(type) expression ==》static_cast<type>(expression)

static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样。它也有功能上限制。例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型,

static_cast不能从表达式中去除const属性,因为另一个新的类型转换操作符const_cast有这样的功能。

const_cast用于类型转换掉表达式的constvolatileness属性。到目前为止,const_cast最普通的用途就是转换掉对象的const属性。

dynamic_cast,它被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)。dynamic_casts在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上(参见条款M24),也不能用它来转换掉constness

如你想在没有继承关系的类型中进行转换,你可能想到static_cast。如果是为了去除const,你总得用const_cast

reinterpret_cast。使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。

正是因为新的类型转换符缺乏美感才能使它弥补了在含义精确性和可辨认性上的缺点。使用新类型转换符的程序更容易被解析(不论是对人工还是对于工具程序),它们允许编译器检测出原来不能发现的错误。这些都是放弃C风格类型转换方法的强有力的理由。还有第三个理由:也许让类型转换符不美观和键入麻烦是一件好事。

Stl中的宏定义:

#  ifndef  _STLP_NO_NEW_STYLE_CASTS

#   define __CONST_CAST(__x,__y) const_cast<__x>(__y)

#   define __STATIC_CAST(__x,__y) static_cast<__x>(__y)

#   define __REINTERPRET_CAST(__x,__y) reinterpret_cast<__x>(__y)

#   define __DYNAMIC_CAST(__x,__y) dynamic_cast<__x>(__y)

#  else

#   define __STATIC_CAST(__x,__y) ((__x)(__y))

#   define __CONST_CAST(__x,__y) ((__x)(__y))

#   define __REINTERPRET_CAST(__x,__y) ((__x)(__y))

#   define __DYNAMIC_CAST(__x,__y) ((__x)(__y))

#  endif

 
编程交流与学习--More Effective C++的学习-Item M3:不要对数组使用多态:【上一篇】
编程交流与学习--More Effective C++的学习-Item M1:指针与引用的区别:【下一篇】
【相关文章】
  • 编程交流与学习--More Effective C++的学习-Item M3:不要对数组使用多态
  • 编程交流与学习--More Effective C++的学习-Item M4:避免无用的缺省构造函数
  • C++数组应用之特殊矩阵的压缩存储
  • VC++ 多文件结构学习
  • C++异常学习笔记
  • VC++编写USB接口程序
  • 《C++编程思想》总结 之六
  • 《C++编程思想》总结 之七
  • Scott Meyers 从5个方面回顾和反思 C++ 历史
  • Modern C++ Design 学习笔记之Policy Based Class Design
  • 【随机文章】
  • 关于使用 file() 读入整个文件时出现的异常断行错误
  • 简单算法——暴风共享软件管理器I V1.0
  • Oracle 10g RAC LVM on Linux by vmware
  • EMS图片格式转换(Java)程序
  • Ajax,JavaOne大会的关注焦点
  • 面试前如何搜集相关资料
  • 全国计算机等级考试三级信息技术考试大纲
  • Cache的原理、设计及实现
  • Python Tutorial(2)
  • 交换机和路由器的区别
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.