1、隐式类型转换:系统会自动进行,无需介入
//会造成一定的精度损失
int a=3+34.9
double n=3+35.9
2、强制类型转换
2.1、c语言风格强制类型转换
int a=(int)2.3;//强制类型转换
//命名的强制类型转换通用形式
强制类型转换名<type>(express);
type:目标类型
express:要转换的对象
2.2、static_cast:静态转换
编译的时候会进行类型转换,这个静态类型转换和c强制类型转换差不多
可用于:
(1)相关类型转换
double f=90.0f;
int a=static_cast<int>(f);
(2)子类转换成父类
切记:父类不可以用static_cast转换成子类
A a;
B b;
A a=static_cast<A>(b);
(3)void与其他任何类型的转换
但是不可用于其他基本类型之间的转换 如int转换成double*…
int *p=&i;
void*q=ststic_cast<void*>(p);
2.3、dynamic_cast
运行时类别识别和检查,主要用于父类型和子类型对象之间的转换,可以将夫类型强制转换成子类型
2.4、const_cast
去除指针或者引用的const去除,能够将const性质转换掉。编译时进行类型转换
int a=10;
const int*p=&a;
int *a2=const_cast<int*>(p)
2.5、reinterpret_cast (比较危险的类型转换)
重新解释(可以在无关的类型之间进行转换)
常用于
整形转换成另一种指针按照转换的类型重新解释内存中的内容
从一个指针类型转换成一个整形
int i=10;
int*pi=&i;
void *pvoid=reinterpret_cast<void*>(pi);
int*pi2=reterpret_cast<int*>(pvoid);
总结:
所有强制类型转换都不建议使用,强制类型转换会抑制编译器报错。尽量少用,千万不要再用c风格的类型转换