第19章 强制
强制:事物被制作或构造成的形式。
19.1 隐式转换
出于为用户的考虑,C++(www.cppentry.com)编译器会在类型之间执行大量的隐式转换。然而,"隐式"并不意味着它们是平凡的或无关紧要的。整型和浮点型之间的转换可能会涉及显著的工作量[Meye1996, Stro1997];不同大小的整型之间的转换则可能会导致截断或符号扩展[Stro1997];而在虚拟派生类型的实例指针之间的转换则可能需要进行指针调整[Lipp1996]。确切地说,这些与转换相关的问题在第13章即有所提及,[Stro1997]中亦对其进行了细致的描述。本节我们考察从编译器那里可以获得什么样的支持以便进行此类转换,并展示如何增强编译器提供的此类支持。
在这些场合下,就连不完美主义实践者的字典中也找不到任何有用的借鉴。其实这里并不存在什么错误,除了整型截断和符号扩展问题外。如果一门语言连从int到double(或者从123到int)的隐式转换都不支持的话,这门语言就显得太"罗嗦"了。
强制(Cast)并不总是意味着对某些东西进行转换,它还可以作为访问某个实体的另一特性的手段,当然,该特性必须是该实例所拥有的。 对于一个"组合类型"(譬如派生类)的实例而言,编译器能够隐式地将其指针或引用转换为它的(任一)基类的指针或引用(这里先不考虑访问限定和二义性的问题)。
事实上,访问某个实体并非直接具有的特性也是可能的。对于类类型来说,可以通过隐式转换操作符来实现这一目的[Meye1996, Meye1998, Sutt2000, Stro1997]。在这些情况下,意味着一次真正意义上的类型转变,而这一点正是我们使用该技术时应该留心的。不用说,这种技术具有非常大的被误用的潜在可能性,在大部分场合下其使用都是不被建议的[Meye1996, Sutt2000, Stro1997, Dewh2003]。