C++:强制类型转换

强制类型转换

C++和C语言存在四种基本类型:整型,浮点型,字符型,布尔型。在C语言中,程序里时常会发生隐式类型转换和强制类型转换,但是他们却没有明显的区分,这就会让我们程序猿耗费多余的精力去区分它们,因此在C++里,就添加了static_cast、const_cast、reinterpret_cast、dynamic_cast,explicit四个关键字,来让我们程序猿很好的区分哪儿是隐式类型转换,哪儿是强制类型转换。

static_cast

static_cast主要用于非多态类型的转换,也就是用于数据类型的转换,它相当于C语言的隐式类型转换。
用法:static_cast<类型>(变量或者表达式)
它有如下的用法:
(1)用于类层次结构中基类和派生类之间指针或引用的转换
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
(2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
(3)把空指针转换成目标类型的空指针
(4)把任何类型的表达式转换为void类型
注意:static_cast不能转换掉expression的const、volitale或者__unaligned属性。切记它不能对不相关类型进行转换。

const_cast

const_cast最常用的用法就是删除变量的const属性,方便赋值。
用法:const_cast<类型>(expression)
它的作用如下:
(1)该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
(2) 常量指针被转化成非常量指针,并且仍然指向原来的对象;
(3)常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
使用const_cast使程序猿的无奈之举,因此在日常的C++程序设计中一定不要使用它去修改指针或者引用的常量性并且去修改原始变量的数值,这是一种很烂的行为。

reinterpret_cast

reinterpret_cast将一种类型转换为另一种类型,这就相当于C语言的强制类型转换。
用法:reinterpret_cast<类型>(expression)
它的作用有下面几点:
(1)改变指针和引用的类型
(2)将指针或引用转换为一个足够长的整型
(3)将整型转换为指针或引用类型
reinterpret的强制类型转换过程只是比特位的拷贝,因此在使用的是要很谨慎。

dynamic_cast

说到dynamic_cast就不得不提一下RTTI(Run_Time Type Identification)运行时类型识别,俗称类型识别,C++是一种静态语言,它的数据类型在编译的时候就已经确定了,但是由于面向对象的多态性要求,C++中的指针或者引用本身的类型,可能和实际类型并不一致,这时候我们程序猿就需要将一个多态指针或引用转化为一个其实际对象的类型,也就是需要知道它运行时的类型,这样就产生了RTTI机制。在C++中使用这个机制的有auto,type_id,decltype,还有就是dynamic_cast。
dynamic_cast用于将父类对象的指针或引用转换为子类对象的指针或引用(动态转换)
一般我们进行向上转换,即子类对象的指针或引用 -> 父类对象的指针或引用,这种情况是不会出现问题的(切片)。
但是我们如果进行向下转换,将父类对象的指针或引用 -> 子类对象的指针或引用,如果不使用dynamic_cast就会很容易出现问题,就像当我们在使用这个本应该是父类指针的子类指针使用它时,就会因为访问越界而程序崩溃。
用法:dynamic<类型>(expression)
注意事项:
(1)dynamic_cast只能用于含有虚函数的类
(2)dynamic_cast会先检查是否可以转换成功,能转换成功就进行转换,不能就返回0.

explicit

explicit是C++的一个关键字,它可以阻止进过转换构造函数进行的隐式转换的发生。
explicit需要注意一点,在C++类级别的隐式类型转换中,单参数的构造函数都支持隐式类型转换(编译器先创建一个匿名对象,然后再进行拷贝构造,最后再将其优化为一个构造函数),如果不允许这种情况的发生,就需要在构造函数之前加上explicit关键字。这么说来所有的智能指针都得加explicit,因为不能将任意类型的指针都给智能指针来管理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值