C++中有4个类型转换符
static_cast
dynamic_cast
reinterpret_cast
const_cast
1、const_cast
const_cast(与C语言强制转换没有区别)
一般用于去除const属性,将const转换成非const
const Person* p1 = new Person;
Person* p2 = const_cast<Person *>(p1); //C++风格
Person* p3 = (Person *)p1; //c语言风格
2、dynamic_cast
dynamic_cast
运行时安全检测(子类指针指向父类对象,安全检测会将指针赋值为空指针)
一般用于多态类型的转换,有运行时安全检测,不安全直接赋值为空指针
强制类型转换没有安全检测
#include <iostream>
using namespace std;
class Person
{
public:
int m_age;
virtual void run() {}
};
class Student : public Person
{
public:
int m_score;
};
int main()
{
Person *p1 = new Person();
Person *p2 = new Student();
cout << p1 << endl;
cout << p2 << endl;
Student *stu1 = dynamic_cast<Student *>(p1);//不安全
Student *stu2 = dynamic_cast<Student *>(p2);//安全
cout << stu1 << endl;
cout << stu2 << endl;
system("pause");
return 0;
}
3、static_cast
static_cast 等同于强制转换
对比dynamic_cast,缺乏运行时安全检测
不能交叉转换(不是同一继承体系的,无法转换)
常用于基本数据类型的转换、非const转成const,适用范围较广
4、reinterpret_cast
reinterpret_cast
属于比较底层的强制转换,没有任何类型检查和格式转换,仅仅是简单的二进制数据拷贝