c++ | cast

18 篇文章 0 订阅

const_cast

修改类型的const或volatile属性,添加const/删除const。(好像大多是删除

int n = 5;
int *k1 = const_cast<int*>(&n);  //指针
*k1 = 1;
int &k2 = const_cast<int&>(n);   //引用
k2 = 2;

const int a = 10;
int* b = const_cast<int*>(&a);
*b = 11;//指针b的属性变成可读可写

但是,对声明为const的变量来说,常量就是常量,任你各种转化,常量的值就是不会变。
因此,const_cast 的主要作用为:

函数的形参不是const,且函数不会改动参数值,则使用const_cast

const int constant = 21;
InputInt(constant); // error: “InputInt”: 不能将参数 1 从“const int”转换为“int *”
InputInt(const_cast<int*>(&constant)); // 用来将const转化为非const

static_cast  将隐式转换明确表示出来

1. 用于内置数据类型的转化
2. 把void类型指针转为目标类型指针(不安全)
3. 子类与父类的转换(子类转父类安全,父类转子类不安全)
不可用于指针之间的转换

父转子不安全的原因:子类的成员/方法往往比父类多,假如原父指针指向父类对象,强制转换成子类指针时,调用子类的方法,但父对象中是没有这个方法的,会出问题。如果用dynamic_cast就直接阻止了这种转换。

dynamic_cast 

1. 用于含虚函数的父类和子类的转换,主要用于父类转子类。子类转父类时作用与static_cast一样。主要是弥补static_cast父转子的不安全

// 父转子时,父类的指针必须指向子类对象 (这也是为什么必须有虚函数)

base *bs = new derive();
derive *de = dynamic_cast<derive*>(bs); // 成功

base *bs2 = new base();
derive *de2 = dynamic_cast<derive*>(bs2); // 不成功,阻止该操作

reinterpret_cast

reinterpret代替显示转换,用于转换各种高风险的转换

原理是,直接把数据类型A的地址解释成另一个数据类型B的地址,逐个比特复制

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值