1.C语言强制类型转换,Type b = (Type)a,这种不安全,转换前没有类型检查。例如:
char *pChar = new char;
int *pInt = (int *)pChar;
这种是从小的地址(char *)转换为大的地址(int *),虽然可以编译过,但是有可能访问不安全的地址。
2.C++提供了四种类型转换,分别适用于其他场景
(1)static_cast : 用于一般的数据类型转换,和具有继承关系的指针或引用。
int main() { int nData1 = 10; double dData2 = static_cast<double>(nData1); int *pData1 = &nData1; double *pData2 = static_cast<double*>(&nData1); //无关类型转换,编译错误 void *pData3 = static_cast<void*>(pData2); system("pause"); return 0; }
(2)dynamic_cast : 只能转换具有继承关系的指针或引用,但是当转换继承关系的指针时,只能由子类指针转换为父类指针,也就是大地址转换为小地址,否则地址越界。
class People { private: string mName; int mAge; }; class Animal { private: int mData1; }; class Dog :public Animal { private: int mData2; }; int main() { People *pPeo = new People(); Animal *pAni = dynamic_cast<Animal *>(pPeo); //没有继承关系,报错 Animal *pAnimal = new Animal(); Dog *pDog = dynamic_cast<Dog *>(pAnimal); //父类->子类,内存越界,报错 Dog *pDog = new Dog(); Animal *pAnimal = dynamic_cast<Dog *>(pDog); //子类->父类,正确 system("pause"); return 0; }
(3)const_cast:去掉或添加const,对象必须时引用或者指针类型。
int main() { int nData1 = 10; const int &nData2 = nData1; int &nData3 = const_cast<int &>(nData2); const int& nData4 = const_cast<const int&>(nData1); system("pause"); return 0; }
(4)reinterpret_cast:强制类型转换,无关的指针类型转换,但必须是指针
class People { private: string mName; int mAge; }; class Animal { private: int mLength; }; int main() { People *pPeo = new People(); Animal *pAni = reinterpret_cast<Animal *>(pPeo); system("pause"); return 0; }
总结
去const属性用const_cast
基本类型转换用static_cast
多态类之间的类型转换用dynamic_cast
不同类型的指针类型转换用reinterpret_cast