2.5.3 强制类型转换

    C++引入了强制类型转换机制来显式地进行类型转换,强制类型转换的格式有两种,举例来说,为了将double型变量x转换为long型,可使用下列语句中的任意一个。


    (long)x; long(x);

    第1种格式,即“(类型名)值”这种写法是C语言的用法,而第2种格式,即“类型名(值)”是纯粹的C++用法,这样,类型名等价于一个函数,而要转换的值等价于该函数的参数,函数返回值即是目的类型值。

    注意

    不论是强制类型转换,还是隐式的赋值转换和表达式中的转换,都不会改变变量的值,而是创建一个新的、指定类型的值,因此,不仅可对变量进行类型转换,对常量的显式转换也是合法的,如下所示。


    int(3.14); float(3.1415926535897);

    以上两种写法都是正确的。

    在显式类型转换中,应该特别注意从较高级别的类型转换为较低级别的类型时,容易引起数据的丢失,见代码2.20。

    代码2.20 显式转换中的数据丢失Conversion


    <———————————————-文件名:example220.cpp———————————> 01 #include<iostream> 02 int main() 03 { 04 using namespace std; 05 unsigned int x=unsigned char(300);//显式转换 06 cout<<"x is"<<x<<endl; 07 return 0; 08 }

    【代码解析】代码第5行,是进行显式数据转换,会导致数据丢失。

    输出结果如下所示。


    x is 44

    代码2.20 中,unsigned char类型在内存中只占一个字节,表述范围0~255,对300只能采取截断处理,只保留低字节,故返回结果为44。

    不加限制的显式类型转换往往会给程序带来很多的安全隐患,为此,C++引入了4个强制类型转换操作符,为数据类型的转换提供了相对安全的方案,关于这部分的内容请参考第17章。