【C++札记】C++中的类型转换

论坛 期权论坛 期权     
码农有道   2019-6-16 21:51   3672   0
码农有道
历史文章目录(请戳我)

关于码农有道(请戳我)

[quote][/quote]

在C/C++语言中,类型转换是一个绕不开的话题,所谓类型转换,其含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。C++提供了多种类型转换的方式,下面将分别讲解。

旧式类型转换旧式类型转换其实就是C风格转换,是从C语言中继承下来的,比如,为了转换一个类型为doubole的浮点数的指针到整型:


或者:



隐式类型转换 C在以下四种情况下会进行隐式转换:
1:算术运算式中,低类型能够转换为高类型。
2:赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型;
3:函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
4:函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。
例如:




C++新式类型转换上面两种方式不能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:’reinterpret_cast’, ‘static_cast’, ‘dynamic_cast’ 和 ‘const_cast’,目的在于控制类(class)之间的类型转换。
dynamic_castdynamic_cast只用于对象的指针和引用。当用于多态类型时, 其将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用和指针。


当按如下创建一个对象b,Base * derived = new Derived(10); 。则默认
  1. derived->sayhi()
复制代码
无法通过编译,因为derived默认所指向的base类中不包含
  1. sayhi()
复制代码
。这时候可以利用
  1. dynamic_cast
复制代码
将其转换为Derived对象,使
  1. sayhi
复制代码
函数可用。
与其他强制转换类型不同,
  1. dynamic_cast
复制代码
涉及运行时类型检查,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,返回值为0或抛出一个bad_cast异常。
因此上述代码中,
  1. Derived * staticDerived = static_cast (base);
复制代码
转换并不考虑类型检查,因此上述转换为错误的,将一个base对象强制转换成Derived,必然缺失了Derived具有的函数。使用
  1. dynamic_cast
复制代码
由于做类型检查,因此非法转换后的值为NULL,而static_cast不能检查转换类型。
const_cast这个转换类型操纵传递对象的const属性,或者是设置或者是移除:


默认const对象是无法赋值给非const变量的,因此
  1. const_cast
复制代码
提供去掉const值的const属性,即可以赋值给非const变量。这里记录下
  1. const int number = 10; int tmp = number;
复制代码
是合法,因为tmp与number并非指向同一个对象,而引用和指针则不行。
static_caststatic_cast 允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)。
意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类,如下所示:


static_cast 除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换,如下所示:



reinterpret_castreinterpret_cast 是一种高度危险的转换,这种转换仅仅是对二进制位的重新解释。
这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。如下所示




推荐阅读:
精心整理 | 2017下半年文章目录
Stack Overflow 10个关于程序员有趣的调查
分布式之缓存击穿(上)

聊聊开源消息中间件的架构和原理
专注服务器后台技术栈知识总结分享
欢迎关注交流共同进步

码农有道 coding

码农有道,为您提供通俗易懂的技术文章,让技术变的更简单!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:60
帖子:12
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP