C++类型转换
类型转换『cast』是将一种数据类型转换成另一种数据类型,大部分是非常有用的,但在转换指针时,我们很可能会将其转换成一个比它更大的类型,可能会破坏其他数据。
动态dynamic_cast
主要用于类层次间的上行和下行转换,上行转换时和static_cast一样效果;在 下行转换时,dynamic_cast具有类型检查功能,更安全;
//dynamic_cast不支持基本类型
char a='a';
//double d=dynamic_cast<double>(a);//err
//上行转换(父类指针指向子类空间 安全)
animal *p1=dynamic_cast<animal*>(new dog);
//下行转换(子类指针指向父类空间 不安全)
//dog* p2= dynamic_cast<dog*>(new animal);//err
//不相关类之间转换,不可以err
静态static_cast
用于类层次结构中基类和派生类之间指针或者引用的转换。
class animal{};
class dog:public animal{};
class other{};
int main(){
//static_cast 作用于基本类型
char a='a';
double d=static_cast<double>(a);
//作用于自定义数据类型(结构体、类)
//关系类转换
//上行转换(安全)
animal *p1=static_cast<animal*>(new dog);
//下行转换(不安全)
dog* p2= static_cast<dog*>(new animal);
//不属于父子类 不可转换,static_cast会报错,强制转换有重大安全隐患
return;
}
常量 const_cast
修改类型const属性,常量指针(引用)转换成非常量指针(引用),并且仍然指向原来 的对象;
const int* p = nullptr;
int *p1 = const_cast<int*>(p);
int *p2 = nullptr;
const int *p3 = const_cast<const int *>(p2);
//只支持指针和应用
const int p4 = 100;
//int p5 = const_cast<int>(p4);//err
int data = 100;
//常量引用转换成普通引用
const int &dd = data;
int &dd2 = const_cast<int &>(ob);
重新解释 reinterpret_cast
这是最不安全的,强制类型转换。一般不用,还不如C语言的转换。