21天学通C++
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.4 类型转换

类型转换是用来把一个类型的值转换成另一个类型。C++是强类型的语言,即其每一个值都有它相应的类型。当用户需要把一个值转换为另一个类型时,就需要使用一些方式进行类型转换。C++中,支持隐式转换和显式转换两种。

2.4.1 隐式转换

隐式转换就是系统默认的,不需要加以声明就可以进行的转换。在隐式转换过程中,编译器无须对转换进行详细检查就能够安全地执行转换。比如从int类型转换到long类型就是一种隐式转换。隐式转换一般不会失败,转换过程中也不会导致信息丢失。

【范例2-8】隐式转换的实现。该范例实现数据类型的隐式转换,将字符型变量转换为整型变量,实现代码如代码清单2-8所示。

代码清单2-8

        1   #include <iostream.h>
        2   void main()
        3   {
        4        char ch;                               //声明字符型变量
        5        ch='a';
        6        int i=ch;                              //声明整型变量并赋初值,隐式转换
        7        cout<<ch<<endl;                        //输出
        8        cout<<i<<endl;
        9   }

【运行结果】在Visual C++中创建一个【C++ Source File】,将上述代码输入其中,输出结果如图2-13所示。

图2-13 隐式转换

【范例解析】范例2-8程序中,声明了一个字符型变量ch和一个整型变量i,并在声明变量i的同时给其赋初值ch的值,此处就需要将字符型的值转换为整型值,Visual C++编译器自动实现了其之间的转换,称为隐式转换。

提示:图2-13中输出整型变量i的值为97,这是因为字母a对应的ASCII码值为97。由此可看出,字符型和整型数据类型之间可以相互转换。

2.4.2 显式转换

通常,隐式转换意味着编译器认为转换是合理的或者是安全的。此外,C++还支持显式转换,显式转换是用户手动指出需要转换的类型。显式转换意味着编译器能够找到一个转换方式,但是它不保证这个转换是否安全,而是需要程序员额外指出。

C++的显式转换提供了更精确的语义和对其进一步扩展的可能。在C语言中,读者可以用一个简单的(int)来完成2.4.1节中字符型到整型的转换。

【范例2-9】显式转换的实现。该范例实现了数据类型之间的显式转换,将字符型变量通过()符显式转换为整型变量,实现代码如代码清单2-9所示。

代码清单2-9

        1   #include <iostream.h>
        2   void main()
        3   {
        4        char ch;                               //声明字符型变量
        5        ch='a';
        6        int i;                                 //声明整型变量并赋初值
        7        i=(int)ch;                             //显式转换
        8        cout<<ch<<endl;                        //输出
        9        cout<<i<<endl;
        10  }

【运行结果】在Visual C++中创建一个【C++ Source File】,将上述代码输入其中,输出结果如图2-14所示。

图2-14 显式转换

【范例解析】范例2-9代码中,使用了语句“i=(int)ch;”将字符型变量ch的类型强制转换为整型,其运行后的效果与如图2-13所示相同。事实上,C++中为显式类型转换提供了四种不同的操作符:static_case、dynamic_cast、const_cast、reinterpret_cast。

注意:C++的显式转换通过区分各种转换情况来增加安全性:通过const_cast来取消const、volatile之类的修饰,通过static_cast来做相关类型的转换,通过reinterpret_cast来做低级的转换等。