由于隐式转换的规则是固定的,两种类型之间的转换只有一种流向,因此在我们不想利用隐式转换规则而是想自由转换或是想增加代码可读性的时候,我们就可以使用显式转换,也可以说是使用强制转换来达成这些目的。显式转换有C风格类型转换和C++类型转换操作符两种风格。
动手写3.4.4
动手写3.4.4展示了用显式转换覆盖隐式转换规则的方法。运行结果如图3.4.4所示:
图3.4.4 C风格的显式转换
在示例中,2本来应该隐式转换成2.0与1.2相加的,但现在由于显式转换的出现,1.2被强制转换成了1,而后面的1000被强制转换为char之后,由于溢出而变成了一个负数的char(1000的二进制数是1111101000,由于char只有8位,会被截取成11101000,转换成数值就是-24了),反而将代表a的97减小成了一个更小的数。此处涉及补码的相关内容,有兴趣的读者可参考其他书籍。
这个示例中的类型转换的语法就是C风格类型转换(另外还有一种类似的函数风格类型转换,我们在此略过)。由于兼容C语言的考虑,C++保留了C风格类型转换操作,但是在实际编程中笔者还是建议使用C++类型转换操作符。我们先来看一个示例:
动手写3.4.5(www.xing528.com)
动手写3.4.5展示了C++类型转换操作符static_cast的用法。运行结果如图3.4.5所示:
图3.4.5 C++类型转换操作符
除了static_cast这个与C风格类型转换基本类似的操作符以外,C++还有const_cast、dynamic_cast和reinterpret_cast这3种特殊的类型转换操作符。由于它们都涉及指针,因此需要在后面的章节中才能讲解。
相比较于C风格的类型转换,使用C++类型转换操作符有以下好处:
1.容易辨识。尖括号(<>)使得C++类型转换操作符非常容易辨识,而在编程中我们也可以搜索“_cast”来寻找类型转换。C风格的类型转换语法显然就更容易被忽略,从而导致错误。
2.语义明确。C++的几种类型转换操作符语义都是互不相同的,而C风格的类型转换都是用同一语法代替,并且一般类型reinterpret_cast并不能用C风格的类型转换实现(只有涉及指针的时候才可以)。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。