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

【C++】 类型转换深度探索:揭开类型转换的奥秘

🌈 个人主页:Zfox_
🔥 系列专栏:C++从入门到精通

目录

  • 一: 🚀 C语言中的类型转换
  • 二: 🔥 为什么C++需要四种类型转换
  • 三: 🔥 C++强制类型转换
    • 🥝 3.1 static_cast
    • 🥝 3.2 reinterpret_cast
    • 🥝 3.3 const_cast
    • 🥝 3.4 dynamic_cast
  • 四: 🔥 RTTI(了解)
  • 五: 🔥 共勉

一: 🚀 C语言中的类型转换

💢 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。
  2. 显式类型转化:需要用户自己处理。
void Test ()
{int i = 1;// 隐式类型转换double d = i;printf("%d, %.2f\n" , i, d);int* p = &i;// 显示的强制类型转换int address = (int) p;printf("%x, %d\n" , p, address);
} 

缺陷:
🎯 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。

二: 🔥 为什么C++需要四种类型转换

🥝 C风格的转换格式很简单,但是有不少缺点的:

  1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  2. 显式类型转换将所有情况混合在一起,代码不够清晰

💢 因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格

三: 🔥 C++强制类型转换

💢 标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:

static_castreinterpret_castconst_castdynamic_cast

🥝 3.1 static_cast

static_cast 用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用 static_cast但它不能用于两个不相关的类型进行转换。

int main()
{double d = 12.34;int a = static_cast<int>(d);cout<<a<<endl;return 0;
}
  • 🎯 对应隐式类型,数据的意义没有改变

🥝 3.2 reinterpret_cast

💢 reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。

💢 reinterpret_ cast任何指针都可以转换成其它类型的指针,T必须是一个指针、 引用、算术类型、指向函数的指针或指向一个类成员的指针。任何指针都可以转换成其它类型的指针,不安全的转换。

int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;// 这里使用static_cast会报错,应该使用reinterpret_cast//int *p = static_cast<int*>(a);int *p = reinterpret_cast<int*>(a);return 0;
}
  • 🎯 对应强制类型,数据的意义已经发生改变

🥝 3.3 const_cast

💢 const_cast最常用的用途就是删除变量的const属性,方便赋值。

void Test ()
{const int a = 2;int* p = const_cast< int*>(&a);*p = 3;cout << a <<endl;
}
  • 🎯 对应强制类型转换中的有风险的去掉const属性
  • 💢 注意此时代码中的a值仍然是2,原因是因为内存中的a值确实被更改为了3,但是由于编译器的优化,把常量存到了寄存器中,此时读取a的值仍然是从寄存器中读取。

🎯 解决方法:加上 volatile 后每次读取就会直接去内存中读取

void Test ()
{volatile const int a = 2;int* p = const_cast< int*>(&a);*p = 3;cout << a <<endl;
}

const_cast 不能去除变量的常量性,只能用来去除指向常数对象的指针或引用的常量性,且去除常量性的对象必须为指针或引用。

🥝 3.4 dynamic_cast

💢 dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。

向上转换子类对象指针/引用 -> 父类指针/引用 (不需要转换,赋值兼容规则)
向下转换父类对象指针/引用 -> 子类指针/引用 ((会出现越界访问) 用dynamic_cast转型是安全的)

注意:
1. dynamic_cast只能用于父类含有虚函数的类。
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0。

class A
{
public :virtual void f(){}
};class B : public A
{};void fun (A* pa)
{// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回B* pb1 = static_cast<B*>(pa);B* pb2 = dynamic_cast<B*>(pa);cout<<"pb1:" <<pb1<< endl;cout<<"pb2:" <<pb2<< endl;
}int main ()
{A a;B b;fun(&a);fun(&b);return 0;
}

注意:

  • 强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。强烈建议:避免使用强制类型转换。

四: 🔥 RTTI(了解)

🎯 RTTI:Run-time Type identification的简称,即:运行时类型识别。

💢 C++通过以下方式来支持RTTI:

  1. typeid运算符
  2. dynamic_cast运算符
  3. decltype

五: 🔥 共勉

以上就是我对 【【C++】 类型转换 的理解,觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~😉
在这里插入图片描述

相关文章:

【C++】 类型转换深度探索:揭开类型转换的奥秘

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 一&#xff1a; &#x1f680; C语言中的类型转换 二&#xff1a; &#x1f525; 为什么C需要四种类型转换 三&#xff1a; &#x1f525; C强制类型转换 &#x1f95d; 3.1 st…...

深入探索Webkit的Web Authentication API:安全与便捷的融合

Web Authentication API&#xff0c;通常被称为WebAuthn&#xff0c;是一个新兴的Web标准&#xff0c;旨在通过提供更安全、更便捷的认证方式来改善用户的在线体验。随着Webkit对WebAuthn的支持日益增强&#xff0c;本文将深入探讨这一API的功能、实现方式以及如何在Webkit浏览…...

Vue - 关于v-wave 波浪动画组件

Vue - 关于v-wave 波浪动画组件 这个动画库可以在标签中添加新的v-wave属性&#xff0c;来让点击标签元素后添加漂亮的波纹效果&#xff0c;并且可以根据父元素自动形成波纹的颜色&#xff0c;也可以自定义波纹颜色&#xff0c;持续时间&#xff0c;透明度&#xff0c;触发的对…...

计算机网络408考研 2019

计算机网络408考研2019年真题解析_哔哩哔哩_bilibili 2019 1 1 1 1...

实时捕捉与追溯:得物基于 eBPF 打造云上网络连接异常摄像头

近期我们容器 SRE 团队基于 eBPF 技术建设网络连接异常感知能力&#xff0c;灰度上线过程中发现了生产环境 10 以上的应用配置错误、程序 Bug 等问题。在和应用负责同学同步风险过程中&#xff0c;大家都挺好奇我们如何实现在对应用无侵入的情况下发现服务连接异常的。本篇文档…...

ubuntu14.04图形界面配置

Ubuntu系统启动&#xff0c;输入用户密码后&#xff0c;屏幕显示彩色背景&#xff0c;但是始终不能进入图形界面。 如果你也遇到过这种情况&#xff0c;可以参照以下方法解决&#xff08;在 ubuntu14.04 验证&#xff09;。 同时按下 alt ctrl F1&#xff0c;屏幕出现 tty1&a…...

51单片机-第八节-蜂鸣器

一、什么是蜂鸣器&#xff1f; 蜂鸣器是一种将电信号转换为声音信号的器件&#xff0c;常用来产生设备的按键音、报警音等提示信号。 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器&#xff1a; 有源蜂鸣器&#xff1a;内部自带振荡源&#xff0c;将正负极接上直流电压即可…...

Windows命令查看WiFi密码

查看所有已保存的WiFi网络 &#xff08;以管理员身份&#xff09;输入以下命令 netsh wlan show profiles查看某个WiFi网络的密码 netsh wlan show profile name"你的网络名" keyclear在输出中&#xff0c;在关键内容&#xff08;Key Content&#xff09;字段下找…...

不同环境下RabbitMQ的安装-2 ARM架构、X86架构、Window系统环境下安装RabbitMQ

ARM架构、X86架构、Window系统环境下RabbitMQ的安装 RabbitMQ安装1 Erlang语言介绍2 安装Erlang2.1 ARM架构的CentOS虚拟机中安装Erlang2.2 X86架构的CentOS虚拟机中安装Erlang2.3 Windows系统安装Erlang2.3.1 下载Erlang2.3.2 安装Erlang2.3.3 配置Erlang2.3.4 检测Erlang 3.安…...

C++(week16): C++提高:(六) Qt提高

文章目录 四、Qt的元对象系统1.元对象和MOC(1)自省 和 反射(2)Qt是怎样支持元对象系统的&#xff1f;(3)支持元对象系统的三个要求(4)元对象系统的功能(5)动态属性 2.信号和槽机制(1)信号与槽机制的基本原理(2)自定义信号、自定义槽函数①自定义信号②自定义槽③关联 connect (…...

go 时间转时间戳的时区设置问题

昨天遇到一个问题&#xff0c;在完成时间转换时间戳&#xff0c;在后续测试中发现转换后的时间戳转成时间后&#xff0c;时间发生错误&#xff0c;时间和转换时间不一致问题 如下&#xff1a; package mainimport ("fmt""time" )func main() {Start : &q…...

MySQL 常见日志清理策略

前言&#xff1a; MySQL 数据库服务器使用多种类型的日志来记录操作和事件&#xff0c;这对于故障诊断、审计和性能分析非常重要。然而&#xff0c;这些日志文件会随着时间的推移而不断增长&#xff0c;可能会占用大量的磁盘空间。因此&#xff0c;定期清理这些日志是必要的&a…...

3大管人绝招让你的手下心服口服

3大管人绝招让你的手下心服口服 一&#xff1a;差异化管理&#xff0c;玩弄人性 谁赞成&#xff0c;谁反对&#xff0c;看清楚谁顺从自己&#xff0c;谁反对自己之后&#xff0c;接下来要做的便是区别对待。 给听话的下属最好的资源、最轻松简单的工作、最高的待遇&#xf…...

useImperativeHandle 是什么?你可以理解为 vue3 的 expose

useImperativeHandle 确实类似于 Vue 3 的 expose&#xff0c;两者都用于控制子组件向父组件暴露的接口。 在 React 中&#xff0c;useImperativeHandle 需要与 forwardRef 一起使用&#xff0c;原因如下&#xff1a; 转发引用&#xff1a;forwardRef 允许父组件将 ref 传递给…...

《Techporters架构搭建》-Day05 属性校验

属性校验 前言Validated基础用法集合校验分组校验嵌套校验自定义校验器 源码地址 前言 在项目开发过程中&#xff0c;经常遇到需要对传递的参数进行校验&#xff0c;比如某个参数字段是否为空、值的取值是否在约定范围、格式是否合法等等&#xff0c;最原始的写法&#xff0c;…...

HTTP的场景实践

HTTP的场景实践&#xff1a;任选一个浏览器&#xff0c;对于其涉及的请求中的缓存策略展开具体分析 1. 强缓存&#xff1a; Cache-Control用于指定缓存的最长有效时间。 Expires用于指定资源过期的日期。 2. 协商缓存&#xff1a; ETag用于标识资源的唯一标识符&#xff0c;…...

MySQL:表的设计原则和聚合函数

所属专栏&#xff1a;MySQL学习 &#x1f48e;1. 表的设计原则 1. 从需求中找到类&#xff0c;类对应到数据库中的实体&#xff0c;实体在数据库中表现为一张一张的表&#xff0c;类中的属性对应着表中的字段 2. 确定类与类的对应关系 3. 使用SQL去创建具体的表 范式&#xff1…...

介绍springmvc-水文

Spring MVC 是一个基于 Java 的开源 Web 框架&#xff0c;它是 Spring Framework 的一部分。Spring MVC 提供了一个架构&#xff0c;用于开发灵活、可扩展的 Web 应用程序。 Spring MVC 的主要特点包括&#xff1a; 基于模型-视图-控制器&#xff08;MVC&#xff09;的架构&am…...

uni-app学习笔记

一、下载HBuilder https://www.dcloud.io/hbuilderx.html 上述网址下载对应版本&#xff0c;下载完成后进行解压&#xff0c;不需要安装&#xff0c;解压完成后&#xff0c;点击HBuilder X.exe文件进行运行程序 二、创建uni-app项目 此处我是按照文档创建的uni-ui项目模板…...

Windows Server修改远程桌面端口

新建入站规则 填写端口 允许连接 修改远程桌面端口 winR打开注册表 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp修改PortNumber为新端口 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wi…...

为什么92%的Sora 2初学者卡在第4步?——帧一致性崩塌诊断工具包+时间轴锚点校准法

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Sora 2视频生成的核心原理与环境准备 Sora 2并非OpenAI官方发布的模型&#xff0c;而是社区基于Sora技术理念构建的开源复现与增强框架&#xff0c;其核心依托于时空联合建模的扩散变换器&#xff08;Spacetim…...

AX-MES生产制造管理系统-总览

前言说起 MES 就不得不说 ERP&#xff0c;但是 ERP 大家基本上都知道&#xff0c;MES 就不一定了&#xff0c;常见的 ERP 系统包括 SAP、金蝶、用友等&#xff0c;ERP的流程相对来说也比较统一&#xff1b;MES就不同了&#xff0c;基本上熟悉业务流程的软件公司都可以开发并实施…...

Arduino PWM转4-20mA工业电流信号:二阶滤波与V/I转换电路设计

1. 项目概述&#xff1a;从PWM到工业标准电流信号在工业自动化、过程控制和传感器领域&#xff0c;4-20 mA电流环是一个几乎无处不在的标准。它用4 mA代表测量值的下限&#xff08;如0C&#xff09;&#xff0c;20 mA代表上限&#xff08;如100C&#xff09;&#xff0c;这种设…...

Unity主题系统设计:状态驱动的主题抽象与自动注入方案

1. 这不是换个颜色那么简单&#xff1a;为什么Unity项目里“换肤”总在发布前夜崩盘&#xff1f;你有没有经历过这样的场景&#xff1a;美术同学凌晨两点发来一套新主题资源包&#xff0c;UI设计师说“这次配色更符合品牌调性”&#xff0c;产品说“上线前必须支持深色模式”&a…...

2026年LLM推理加速全景:量化、投机解码与KV Cache工程实战

大语言模型推理速度慢、成本高&#xff0c;是阻碍AI大规模落地的核心障碍之一。一个7B参数的模型&#xff0c;在标准配置下每秒只能生成约30个token&#xff0c;对于需要实时响应的应用来说几乎无法接受。但2026年&#xff0c;一系列推理加速技术的成熟&#xff0c;让这一局面发…...

WTF Auto Layout? 实战:10个常见约束冲突案例解析与解决方案

WTF Auto Layout? 实战&#xff1a;10个常见约束冲突案例解析与解决方案 【免费下载链接】wtfautolayout The source code for Why The Failure, Auto Layout? 项目地址: https://gitcode.com/gh_mirrors/wt/wtfautolayout 在iOS开发中&#xff0c;Auto Layout是构建灵…...

TVA注意力层INT8量化配置技巧

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

艾尔登法环存档迁移终极指南:3分钟解决角色转移难题

艾尔登法环存档迁移终极指南&#xff1a;3分钟解决角色转移难题 【免费下载链接】EldenRingSaveCopier 项目地址: https://gitcode.com/gh_mirrors/el/EldenRingSaveCopier 还在为《艾尔登法环》存档版本不兼容而烦恼吗&#xff1f;EldenRingSaveCopier 是你的终极解决…...

Log4Shell漏洞深度解析:Spring Boot日志注入原理与四层修复方案

1. 这个漏洞不是“远程执行代码”那么简单——它是一次对Java生态信任链的系统性击穿Log4j CVE-2021-44228&#xff0c;业内常简称为“Log4Shell”&#xff0c;2021年12月爆发时&#xff0c;我正在给一家金融客户的Spring Boot微服务集群做灰度发布前的安全加固。凌晨三点收到告…...

GEP协议深度解读:AI智能体自我进化的基因工程

OpenAI 官宣全面支持MCP协议,标志着AI应用架构的"连接标准"已定。如果说MCP是AI时代的USB-C,解决了模型与工具的连接问题,那么GEP(Genome Evolution Protocol,基因组进化协议)则正在解决另一个更本质的问题——智能体的自我进化与生命周期管理。 作为下一代AI基…...