新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/9/23 8:43:56来源:尧图网络
一文详解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

相关资讯

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

较早相关资讯

最新相关资讯

3个细节看懂激情之夜源码,面试必问不慌 2026/9/23 10:58:31

3个细节看懂激情之夜源码,面试必问不慌

3个细节看懂激情之夜源码,面试必问不慌 面试被问到底层原理,你卡壳了?别急,这正是【激情之夜】这类高并发场景下的经典陷阱。很多开发者盯着业务逻辑写代码,却忽略了并发控制的核心机制,导致线上事故频发。今天我们就拆解这个GitHub…

阅读更多 →
微信小程序开发全流程:从账号注册到发布的避坑指南 2026/9/23 10:58:23

微信小程序开发全流程:从账号注册到发布的避坑指南

微信小程序开发流程这个话题,网上随便一搜就是一堆“注册账号—下载工具—新建项目—写代码—提交审核”的流水账。但真在项目里滚过几轮的人都清楚,流程远没有那么潇洒。从账号主体怎么选、框架用什么,到顶部导航栏高度在不同机型上怎么裂开…

阅读更多 →
工作流引擎选型指南:Airflow、n8n、Prefect静态扫描横评 2026/9/23 10:58:23

工作流引擎选型指南:Airflow、n8n、Prefect静态扫描横评

1. 为什么我要做这次静态扫描横评工作流引擎这个赛道,最近两年肉眼可见地热闹起来了。我最早接触的是 Airflow,那会儿还在做数据仓库的 ETL 调度,后来团队里有人开始用 n8n 做业务侧的自动化,再后来 Prefect 打着“现代数据编排”…

阅读更多 →
GEO行业资源对接指南:打破信息孤岛,提升效率 2026/9/23 10:58:17

GEO行业资源对接指南:打破信息孤岛,提升效率

1. 项目背景与核心价值在GEO(地理空间信息)行业摸爬滚打这些年,最常被同行问到的就是"哪里能找到靠谱的数据供应商"、"谁家遥感解译做得专业"这类资源对接问题。这个行业存在一个典型矛盾:一方面产业链条长、…

阅读更多 →
3个维度看懂分级阅读:图解原理与选型指南 2026/9/23 10:58:17

3个维度看懂分级阅读:图解原理与选型指南

3个维度看懂分级阅读:图解原理与选型指南 学会语法却不知怎么搭项目?别慌,这不是你的错。很多开发者卡在“代码能跑”到“系统能稳”的断层,根源在于没搞懂底层逻辑。今天用图解原理拆解分级阅读,帮你把碎片知识拼成完整拼图。…

阅读更多 →
鸿蒙分布式架构与百度IP情感分析的智能家居应用 2026/9/23 10:58:17

鸿蒙分布式架构与百度IP情感分析的智能家居应用

1. 项目背景与核心价值去年在开发一款智能家居中控应用时,遇到了一个棘手的问题:系统需要根据用户的语音指令自动判断情绪状态,但自研的算法准确率始终徘徊在75%左右。经过多次尝试,最终选择通过鸿蒙系统的分布式能力接入百度IP的…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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