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来做低级的转换等。