新闻详情

新闻详情

首页 / 资讯中心 / 详情

一文详解C++中的类型转化

发布时间:2026/9/26 17:33:18来源:尧图网络
一文详解C++中的类型转化
1. C语言中的类型转换在C语言中如果赋值运算符左右两侧类型不同或者形参与实参类型不匹配或者返回值类型与接收返回值类型不一致时就需要发生类型转化C语言中总共有两种形式的类型转换隐式类型转换和显式类型转换。1. 隐式类型转化编译器在编译阶段自动进行能转就转不能转就编译失败2. 显式类型转化需要用户自己处理举个例子12345678910111213141516intmain(){doublei 4.2;//隐式类型转化inta i;//显示的强制类型转换intb (int)i;int*paintd(int)p;cout i endl;cout b endl;cout a endl;cout d endl;}那为什么还要出现C中的类型转换呢因为C语言中的隐式类型转换会带来很多问题比如123456789intmain(){inti 0;size_tsize 5;while(size i){size--;}}size是无符号整型i是int在操作符两端的类型就会发生整型提升导致size永远大于0造成死循环。所以C出了一套类型转化的规范写法。隐式类型转化有些情况下可能会出问题比如数据精度丢失显式类型转换将所有情况混合在一起代码不够清晰因此C提出了自己的类型转化风格注意因为C要兼容C语言所以C中还可以使用C语言的转化风格。2. C强制类型转换static_castreinterpret_castconst_castdynamic_cast这是c规范的四种类型转化。1. static_cast2.reinterpret_cast3.const_cast我们来看一个例子123456789intmain(){constinta 2;int* p const_castint*(a);//去掉const属性*p 5;cout a endl;cout *p endl;return0;}大家可以猜一下结果是什么可能有人会想这不是改变了吗为什么还是2呢原因是在编译时因为是const修饰不会修改所以就会把a的值放入寄存器中通过*p来改变的是内存中的a的值但是a在寄存器中的值没有改变依旧是2所以打印时就是2。为了防止这种优化行为的发生就会在a的前面加volatile const int a2;表明了a的值会改变不要放在寄存器中所以每次去取a的值就会到内存中去取。保持内存可见性就因为const_cast会导致这种危险行为的发生所以C就会把const_cast这个类型转化单独拿出来但用的时候很危险可以看出const_cast取消了const属性。4.dynamic_cast这种类型转化是专门来针对父类和子类指针之间的相互转化的dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用 (动态转换)向上转型子类对象指针/引用-父类指针/引用(不需要转换赋值兼容规则天然的一种行为)向下转型父类对象指针/引用-子类指针/引用(用dynamic_cast转型是安全的)注意1. dynamic_cast只能用于父类含有虚函数的类2.dynamic_cast会先检查是否能转换成功能成功则转换不能则返回0如果我们不使用dynamic_cast来进行向下转型父类转化为子类那就会发生越界的情况123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657classA{public:virtualvoidf() {}int_a 0;};classB :publicA{public:int_b 0;};//C语言中的强转//void Func(A* ptr)//{// // 直接转换是不安全的// B* bptr (B*)ptr; //父类转子类// cout bptr endl;//// bptr-_a;// bptr-_b; //发生越界//// cout bptr-_a endl;// cout bptr-_b endl;//}voidFunc(A* ptr){// C规范的dynamic_cast是安全的// 如果ptr是指向父类则转换失败返回空// 如果ptr是指向子类则转换成功B* bptr dynamic_castB*(ptr);cout bptr endl;if(bptr){bptr-_a;bptr-_b;cout bptr-_a endl;cout bptr-_b endl;}}intmain(){A aa;B bb;Func(aa);Func(bb);return0;}总结这就是C中的四种类型转化但是强制类型转换关闭或挂起了正常的类型检查每次使用强制类型转换前程序员应该仔细考虑是否还有其他不同的方法达到同一目的如果非强制类型转换不可则应限制强制转换值的作用域以减少发生错误的机会。 强烈建议避免使用强制类型转换
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

深入解析 SAP HANA M_SQLSCRIPT_PLAN_PROFILER_RESULTS 视图,从执行时间、CPU 消耗、内存占用到嵌套调用的性能诊断 2026/9/26 17:33:15

深入解析 SAP HANA M_SQLSCRIPT_PLAN_PROFILER_RESULTS 视图,从执行时间、CPU 消耗、内存占用到嵌套调用的性能诊断

在 SAP HANA 数据库中排查存储过程的性能问题时,我们经常会遇到一种情况,某个存储过程执行了十几秒,但单独检查其中的 SQL 语句,却没有找到明显的慢查询。查看数据库的 CPU 使用率,可能没有持续处于高位,检查内存占用,也未必能够直接定位到异常操作。即使通过 SQL 执行计…

阅读更多 →
经销商管理系统适合哪些企业 2026年有哪些主流的DMS经销商管理系统 2026/9/26 17:33:15

经销商管理系统适合哪些企业 2026年有哪些主流的DMS经销商管理系统

在2026年的商业版图中,渠道的边界正在消融,全链路协同已成为行业标配。对于品牌商而言,经销商管理系统(DMS)不再仅仅是处理订单的工具,而是连接供应商、品牌商、经销商乃至终端门店的数字化中枢。面对市场上…

阅读更多 →
Atlas 300V 24G推理卡部署YOLOv5实战指南 2026/9/26 17:33:15

Atlas 300V 24G推理卡部署YOLOv5实战指南

提到“atlas”,网上能搜出好几类东西:有做数据库的MongoDB Atlas,也有各种叫Atlas的项目工具。但最近热搜上的“atlas部署yolo”和“atlas 300v 24g 是运算加速卡吗”,明显是指华为昇腾Atlas系列推理卡。我前阵子刚好把一台装了At…

阅读更多 →
DeskcommCRM部署实战:客服与工单系统一体化落地指南 2026/9/26 17:33:08

DeskcommCRM部署实战:客服与工单系统一体化落地指南

上周一个做 SaaS 的创业公司朋友跑来问我:客户在企微里询价、在邮件里提工单、销售用 Excel 跟进,数据和沟通全散在各处,到底要不要花几周自研一套内部系统?我的回答是:先别急着写代码,把 DeskcommCRM 装起…

阅读更多 →
OpenClaw 100% Context 问题找到了:从 compaction 到 skillsSnapshot 的排查路径 2026/9/26 17:33:08

OpenClaw 100% Context 问题找到了:从 compaction 到 skillsSnapshot 的排查路径

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
模板代码模块化设计:408代码题高效备考新思路 2026/9/26 17:33:08

模板代码模块化设计:408代码题高效备考新思路

408备考最让人头疼的,往往不是选择题,而是最后那道代码题。很多同学在刷题的时候都会经历这个阶段:看答案觉得完全能看懂,合上答案自己写,要么卡在某个指针操作上,要么递归出口写错,涂涂改改半小…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉