![](https://csdnimg.cn/release/download_crawler_static/3854548/bg9.jpg)
1.5.
类型转换
3
(b) 如果两个操作数的类型都不是unsigned long,而其中一个操作数是long型,则
另一个也被转换为long型。
long类型的一般转换有一个例外。如果一个操作数是long型而另一个是unsigned
int型,那么只有机器上的long型的长度足以存放unsigned int的所有值时(一
般来说,在32位操作系统中long型和int型都用4个字节,也即1个字长表示,
所以不满足这里的假设条件),unsigned int才会被转换为long型,否则两个
操作数都被提升为unsigned long型。若两个操作数都不是long型而其中一个
是unsigned int型,则另一样也被转换成unsigned int型,否则两个操作数一定
都是int型。
1.5.2 显显显示示示类类类型型型转转转换换换
C++同时提供了4种新的强制转型形式:
• dynamic cast(expression)
dynamic cast主要用于执行“安全的向下转型(safe downcasting)”。也就是
说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风
格语法执行的强制转型,也是唯一可能有重大运行时代价的强制转型。
• static cast(expression)
static cast可以被用于强制隐型转换(例如,non-const对象转型为const对象,int转
型为double等等),它还可以用于很多这样的转换的反向转换(例如,void*指针转
型为有类型指针,基类指针转型为派生类指针)。但是它不能将一个const对象转型
为non-const对象(只有const cast能做到)。它最接近于C-style的转换。
• const cast(expression)
const cast一般用于强制消除对象的常量性。它是唯一能做到这一点的C++风格
的强制转型。
• reinterpret cast(expression)
reinterpret cast是特意用于底层的强制转型,导致实现依赖(inplementation-
dependent)(就是说,不可移植)的结果。例如,将一个指针转型为一个整数。这
样的强制转型在底层代码以外应该极为罕见。
旧风格的强制转型依然合法,但新的形式更可取。原因如下:
1. 在代码中它们更容易识别(无论是人还是像grep这样的工具都是如此),这样就简
化了在代码中寻找类型系统被破坏的地方的过程。
2. 更精确地指定每一个强制转型的目的,使得编译器诊断使用错误成为可能。例如,
如果你试图使用一个const cast以外的新风格强制转型来消除常量性,你的代码将无
法编译。