C++除了强制类型转换意外还有4种使用关键字的类型转换
示例代码提供3个类,在下面4种类型转换中的示例代码中都要使用,Person是Student的父类,并且有虚函数,构成了多态.Animal不跟任何类有关系,用来实验,没有继承效果的类型转换:
using namespace::std;
class Person{
public:
int age;
Person(int a):age(a){};
virtual void display(){}//c++有虚函数才能算多态
};
class Student:public Person{
public:
Student(int a):Person(a){
}
};
class Animal{
public:
int feets;
};
const_cast
去除const属性,将const转换成非const
格式:
const_cast<类型>(被转换的变量)
int main(int argc, const char * argv[]) {
const Person *p1 = new Person(3);
// Person *p2 = p1;//直接把const类型转化成非const类型会报错
Person *p2 = const_cast<Person*>(p1);//使用const_cast可以把const类型转换成非const类型,
cout <<p2->age<<endl;
}
dynamic_cast
用于父类子类指针多态的转换,运行时候检测是否能指针能转换成功
格式:
dynamic_cast<类型>(被转换的变量)
示例代码:
Person *p3 = new Person(3);
Person *p4 = new Student(4);
// Student *p5 = p3;//直接转换会报错,因为类型不同
Student *p5 = dynamic_cast<Student*>(p3);//直接转换会报错,因为类型不同
Student *p6 = dynamic_cast<Student*>(p4);//直接转换会报错,因为类型不同
Animal *c1 = dynamic_cast<Animal *>(p3);//交叉转换,不同类型之间的转换
cout << p5 <<endl;//转化失败,给p5赋值为0
cout <<p4<<endl<< p6 <<endl;//转换成功,给p6赋值为p4地址
cout<< c1 <<endl;//转换失败,c1为0
static_cast
可以用于基本数据类型转换,跟系统默认的强制类型转换效果一样
格式:
static_cast<类型>(被转换的变量)
示例代码:
int a1 = 10;
float f1 = static_cast<float>(a1);
int a2 = static_cast<int>(3.14);
cout << f1 <<endl;
cout << a2 <<endl;
//Animal * an1 = static_cast<Animal *>(p3);//Person不能转换成Animal编译就会报错
reinterpret_cast
强制转换 按照二进制数据拷贝数据的转换. 没有格式转换,例如把浮点数转换成整数,也是直接复制二进制数据
格式:
reinterpret_cast<类型>(被转换的变量)
示例代码:
int a4 = 3;
int *p7 = &a4;
float* f4 = reinterpret_cast<float*>(p7);
cout << "int 3 内存复制到浮点数 的内存后转换为:"<< f4 << endl;
Student *p8 = new Student(3);
Person *p9 = reinterpret_cast<Person*>(p8); // Student和 Person是继承关系,而且里面成员变量都有age,所以转换以后内存存储age的地方一样
Student *p10 = reinterpret_cast<Student*>(p9);
Animal *p11 = reinterpret_cast<Animal*>(p9);
cout << p9->age <<endl;
cout << p10->age <<endl;
cout <<"Animal feets="<<p11->feets <<endl;//打印出来数字不一定是什么,因为Animal和 Person内存格式不一样,复制以后覆盖的不一样