新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/11/4 5:02:52来源:尧图网络
一文详解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

相关资讯

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

较早相关资讯

最新相关资讯

【外设】之大彩串口显示屏 2026/11/3 7:07:39

【外设】之大彩串口显示屏

大彩串口屏初步使用 1 .官网下载 STM32 屏幕 GUI 设计资料 http://www.gz-dc.com/category/typeid/4112 找到 STM32 Keil 工程,移植相关代码因项目而异进行移植,由于项目简单,本人只对用到的指令接口进行修改。 比如:注意事项&…

阅读更多 →
无法下载Windows系统iso文件 2026/11/3 12:09:35

无法下载Windows系统iso文件

当我遇到这个问题的时候,我打开了一个网站: 登录 然后我打算下载的时候: 突然那个官方的连接就可以下载了:

阅读更多 →
【清华代码熊】DeepSeek V4.1 Flash 后训练详解 2026/11/3 12:09:38

【清华代码熊】DeepSeek V4.1 Flash 后训练详解

📌 上期解析了 DeepSeek V4.1 Flash 模型架构改进,本期解析 DeepSeek V4.1 Flash 预训练/后训练技术: 🌟 预训练:45T 文本 多模态混合语料、直接训练 sparse attention(取消 DeepSeek V4 的 dense 冷启动&…

阅读更多 →
Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ... 2026/11/3 12:09:41

Shuffle-R1: Efficient RL framework for Multimodal Large Language Models via Data-centric Dynamic ...

文章主要内容和创新点 主要内容 本文聚焦于多模态大语言模型(MLLM)强化学习(RL)训练中的效率问题,提出了一个名为Shuffle-R1的框架。研究发现,当前RL训练存在两个关键缺陷: 优势值坍缩(Advantage Collapsing):批次中大多数优势值集中在零附近,导致有效梯度信号被淹…

阅读更多 →
PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction 2026/11/4 1:25:31

PRvL: Quantifying the Capabilities and Risks of Large Language Models for PII Redaction

一、文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)实现个人身份信息(PII)脱敏的研究,旨在解决传统脱敏方法(如基于规则的系统、领域特定命名实体识别(NER)模型)泛化能力差、跨格式/跨语境适应性弱的问题。 研究通过全面评估多种LLM架构(包括密集型LLM(D-LLM…

阅读更多 →
LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model 2026/11/4 3:51:11

LLaVA-RE: Binary Image-Text Relevancy Evaluation with Multimodal Large Language Model

文章主要内容和创新点 主要内容 本文聚焦于二进制图像-文本相关性评估任务(判断图像与文本“相关”或“不相关”),针对该任务中文本格式多样、相关性定义随场景变化等挑战,提出了基于多模态大语言模型(MLLM)的解决方案LLaVA-RE。 模型设计:LLaVA-RE基于LLaVA 1.5架构,…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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