四种cast分别为 static_cast、dynamic_cast、reinterpret_cast、const_cast
static_cast: 代替隐式替换,对象可以是类也可以是指针和引用,在进行基类向派生类转换时不提供安全检查
class Base{};
class Group : public Base{};
int main(){
Base* b1 = new Base();
Base* b2 = new Group();
Group* gg;
gg = static_cast<Group*>(b1);//编译可通过,返回的是派生类指针,但是是不安全的,因为派生类指针所解释的内存空间比基类长,可能造成越界
gg = static_cast<Group*>(b2);//编译可通过,安全的
}
dynamic_cast:对象必须是指针和引用,在进行基类向派生类转换时提供安全检查
class Base{};
class Group : public Base{};
int main(){
Base* b1 = new Base();
Base* b2 = new Group();
Group* gg;
gg = static_cast<Group*>(b1);//编译可通过,但是返回的是空指针
gg = static_cast<Group*>(b2);//编译可通过,安全的
}
const_cast:去除对象的const和volatile属性,但是const_cast中的类型必须是指针或引用
const int a = 100;
int& b = const_cast<int&>(a);
b = 110;
cout << a << endl;
cout << b << endl;
//打印结果为 100(const变量在编译阶段会被替换,因此第一行打印中的a被替换成100) 110
reinterpret_cast:显示转换,可以进行任意的转换,是通过完全复制对象的二进制数据,返回的结果不可控,不会进行安全检查