C++的4种类型转换const_cast dynamic_cast static_cast reinterpret_cast教程


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内存格式不一样,复制以后覆盖的不一样
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值