类型转换
对象的类型定义了对象能包含的数据(存储空间大小、存储方式、数值范围等)和能参与的运算。当在程序的某处我们使用的类型和应当取的类型不一致时就需要
进行类型转换, 前提是两种类型是相关联的。类型的转换分为隐式转换和显式转换。
隐式转换
隐式转换程序自动完成的,无需我们介入。隐式转换常发生的场合:
1)比int类型小的整型值首先提升为较大的整数类型;
2)在条件中,非布尔值会转换成布尔类型;
3)初始化过程中,初始值会转换为变量的类型
4)在赋值语句中,右侧的运算对象会转换成左侧的运算对象;
5)如果算数运算或者关系运算的运算对象有多种类型,需要转换成同一种类型;
6)函数调用时也会发生类型转换。
算术转换
整型提升:负责把小整数类型转换为较大的整数类型。对于比int小的整型来说,只要他们所有可能的值在int范围内就会提升成int型,否则提升成unsigned int型。 较大的char类型会被提升成最接近的整型。针对无符号类型的转换需要依赖机器中各个整数类型的相对大小。
指针转换
1)在大多数数组的表达中,数组中自动转换成只想数组首元素的指针。
2)常量整数型0 或 字面值 nullptr 能转换成任意指针类型。
3)指向任意非常量的指针能转换为成void *。
4)指向任意对象的指针能转换成const void *。
5)允许将指向非常量类型的指针转换成相应的常量类型的指针。
布尔值转换
存在一种算数类型或者指针类型转换为布尔类型的自动转换机制。
类类型转换
类类型能定义有编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。
显式转换
命名的强制类型转换
cast-name<type> (expression)
其中type是转换的目标类型而expression是要转换的值。如果type是引用类型,则结果是左值。cast-name是static_cast,dynamic_cast,const_cast,reinterpret_cast中的一种。
static_cast: 任何具有明确定义的类型,只要不要底层const,均可以使用static_cast转换;const_cast:只能改变运算对象的底层const;
reinterpret_cast:通常为运算对象的位模式提供较低层次上的重新解释。
旧式的强制类型转换
<type>(expr);//函数形式的强制类型转换
(type) expr;//C语言风格的强制类型转换