1. 常量转换(const_cast)。=》方便赋值
常量转换用于去掉表达式的const属性,使其变成非常量表达式,方便赋值。常量转换不能改变表达式的类型,只能改变const属性。示例代码:
const int a = 10;
int b = const_cast<int&>(a);
2. 静态转换(static_cast)。=》隐式自动类型转换
静态类型转换主要用于2种转换环境
2.1 C++内置类型的转换:
原有类型的自动类型转换,如short转int,int转double,向上转型等
不能转内置类型指针!!
2.2 当有继承关系存在时:(用于向上转型)
如果使用static_cast 由子类向父类转型,向上转型,天然安全安全。
static_cast提供编译器认为安全的类型转换,例如在继承中,可以用派生类对象给基类对象赋值;
静态转换可以在编译时期完成,适用于具有继承关系的类或者指针类型之间的转换。静态转换会进行一些类型检查,但是不会进行运行时检查。如果类型无法转换,则会编译报错。
示例代码:
double d = 3.14;
int i = static_cast<int>(d);
3、reinterpret_cast =》对应的是C语言中的显示类型转换,支持非相近类型的转换
C++还提供了reinterpret_cast用于任意类型的转换,即reinterpret_cast运算符允许将任意指针转换到其他指针类型,也允许做任意整数类型和任意指针类型之间的转换。转换时,执行的是逐个比特复制的操作。reinterpret中文意为“重新解释; 重新诠释;”。
reinpreter_cast<type-id> (exp)
其中, reinterpret_cast后的尖括号中的type-id类型必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针。
4、动态转换(dynamic_cast)。
类型转换:dynamic_cast(用于向下转型)
向下转型:父类对象指针/引用 “转型为” 子类指针/引用;
父类对象指针/引用 ->子类指针/引用(用dynamic_cast转型是安全的)
要求:
dynamic_cast只能用于父类含有虚函数的类(必须是多态,因为虚函数表内存了一个判断它是子类还是父类)
dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr
动态转换可以在运行时期完成,适用于具有继承关系的类或指针类型之间的转换。动态转换会进行类型检查,如果类型无法转换,则返回空指针(对于指针类型)或抛出bad_cast异常(对于引用类型)。
示例代码:
class Base { virtual void foo() {} };
class Derived : public Base {};
Base* ptr = new Derived;
Derived* dptr = dynamic_cast<Derived*>(ptr);
if (dptr != nullptr) {
// 转换成功
} else {
// 转换失败
}
另注意:
向上转型是指:子类对象指针/引用 -> 父类指针/引用(不需要转换,赋值兼容规则)