当前位置: 首页 > news >正文

C++中的强制类型转换

接触过C语言的朋友都知道,C语言中也有强制类型转换,但是C语言中的强制类型转换会有一些问题,比如:

int a = 0x1234;
char b = (char)a;

上述的代码出现一个问题就是a 这个int型强制转化成b 这个char型时损失了一些精度,

除此之外,比如没有内存检测(数字转化为地址类型)等。

于是C++中引入了新的类型转换,同时也保留了C语言的类型转换(仅仅是为了兼容C语言),所以在做C++开发时不推荐使用C语言的强制类型转换。

C++强制类型转换主要分4类:static_cast、const_cast、dynamic_cast、reinterpret_cast

1、用法:xxx_cast<要转换的目标类型>(表达式)

2、区别:

① static_cast(没有运行时类型检查来保证转换的安全性)

                用于基本类型间(int double float等)的转换

                不能用于基本类型指针间的转换

                用于有继承关系类对象之间的转换和类指针之间的转换

②const_cast

                去除变量的只读属性

                强制转换的目标类型必须是指针或引用

③reinterpret_cast

                用于指针类型间的强制转换

                用于整数和指针类型间的强制转换

④dynamic_cast

               用于有继承关系类指针之间的转换

               用于有交叉关系类指针之间的转换

               具有类型检查的功能

               需要虚函数的支持

如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0。如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准库头文件中) 

上述强制转换一定要考虑到数值范围、内存大小问题。

数值问题:比如一个float类型的数据转换为short数据时,肯定会有精度损失(当被转换变量的值超过short的范围)

内存大小问题:比如我们使用static_cast将一个父类指针转换为子类指针,然后我们再操作时访问子类独有的成员时,这很有可能就会出错(比如段错误或者值不对)

http://www.lryc.cn/news/3335.html

相关文章:

  • 任何人都可以学习Rasa之优秀Rasa学习资源推荐
  • 数据中心的 TCP-Delay ACK 与 RTO, RACK
  • MySQL与常见面试题
  • FFmpeg进阶: 采用音频滤镜对音频进行转码
  • C++:AVL树
  • Docker中安装Oracle-12c
  • 教你如何用Python分析出选注双色球号码
  • elasticsearch映射及字段类型
  • 1493围圈报数(队列)
  • 【ArcGIS Pro二次开发】(2):创建一个Add-in项目
  • 浏览器缓存是如何提升网站访问速度的
  • Linux中几个在终端中有趣的命令
  • 快来来试试SpringBoot3 中的新玩意~
  • 【寻人启事】达坦科技持续招人ing
  • 【C/C++基础练习题】简单函数练习题
  • 【代码随想录训练营】【Day11】第五章|栈与队列|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值
  • 基于云原生分布式存储ceph实现k8s数据持久化
  • SpringMVC获取请求参数
  • 详解浏览器从输入URL到页面展示的过程
  • 【吉先生的Java全栈之路】
  • 第二章 Opencv图像处理基本操作
  • 字节一面:在浏览器地址栏输入一个 URL 后回车,背后发生了什么?
  • 推荐3dMax三维设计十大插件
  • Arduino IDE 2.0.6中 ESP32开发环境搭建笔记
  • 商品秒杀接口压测及优化
  • NFC 项目前期准备工作
  • (C语言)数据的存储
  • C语言深度剖析之文件操作
  • RNN神经网络初探
  • 【flinkx】【hdfs】【ing】Cannot obtain block length for LocatedBlock