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用于类型转换掉表达式的const或volatileness属性。到目前为止,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