1.静态
static_cast<目标类型>(源类型变量)
编译器对 源类型 和 目标类型 做相容性检查(在源和目标之间存在至少一个方向可以做隐式类型转换(包括类型转换构造函数,类型转换运算符 函数),那么这两个类型就是相容类型)
如果想要程序员显示的执行类型转换,则在类型转换构造函数前添加explicit关键字,如此编译器编译时如果存在隐式类型转换直接报错,必须显示的使用类型转换,即通过static_cast进行类型转换完成。
百度文库-C语言隐式类型转换规则
2.动态
dynamic_cast<目标类型>(源类型变量)
具有多态性的父子类型的指针或引用。
注意:
在类型转换构造函数中,如果想要改转换显示完成,需要在该类型转换构造函数中使用explicit修饰
3.去常
const_cast<目标类型>(源类型变量)
去掉或添加指针类型的常属性,通常用于去常,因为加常属性可以隐式完成,如非常变量可以传递给函数的常形参。
编译器的常量优化:
const int a = 100;
int& x = const_cast<int&>(a);
x = 200;
cout << a << ' ' << x << endl;// 100 200
编译器的常量优化策略在编译阶段直接将常量的值直接编译到代码中,省去从内存中取值压栈出栈过程。
即实际编译成的二进制码其实是:
cout << 100 << ' ' << x << endl; //a的值是在编译阶段就确定了,x的值是在运行时确定的 。
4.重解释
reinterpret_cast<目标类型>(源类型变量)
转换任意类型的指针或者引用。
- 同为指针或者同为引用;
- 任意类型的指针和整型之间;