何时发生隐式转换:
算术转换
运算符的对象将转换成最宽的类型,比如一个运算对象的类型是long double,那么无论另外一个运算对象的类型是什么都会转换成long double
整型提升
整型提升负责把小整数类型转换成较大的整数类型(先int,装不下就unsigned int ,再是unsigned long,long long,unsigned long long )
无符号类型的运算对象
如果一个运算对象是无符号类型,且不小于另一个运算对象(有符号类型),那么有符号的运算对象会转换成无符号的对象,
如果有符号的运算对象此时是负数,则转换后的值 = 它的值 + 无符号类型最大值
若带符号大于无符号,则转换结果依赖于机器:如果无符号类型的所有值都能存在该带符号类型中,则无符号对象转换成有符号对象,如果不能,则带符号对象转换成无符号类型
其它隐式类型转换
数组转换成指针
mark
指针转换
常量整数值0或字面值nullptr能转换成任意指针类型
指向任意非常量的指针可以转换成void*
指向任意对象的指针可以转换成const void*
转换成bool类型
如果指针或算术类型的值为0,转换结果为false,否则为true
转换成常量
允许将指向非常量类型的指针转换成指向相应的常量类型指针,反过来不行
类类型的转换
类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换
显式转换
强制类型转换的形式:
type为转换的目标类型,如果type是引用类型,则结果是左值
cast-name是static_cast、dynamic_cast、const_cast 和 reinterpret_cast 中的一种
static_cast
任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast
dynamic_cast
将一个基类对象指针(或引用)cast到继承类指针
const_cast
只能改变运算对象的底层const
reinterpret_cast
为运算对象的位模式提供较低层次上的重新解释