C++强制类型转换

C和C++的强制类型转换 C++ 四种强制类型转换 一般来说,我们需要类型转换的场景可以分为如下几种: 整型和浮点型以及不同长度的数据相互转换 一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题 整型和指针相互转换 当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。 整型和枚举类型相互转换。 这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。 指针 阅读详情

先后看过几次关于C++类型转换的资料,甚至还用过几次,可对其了解还是很模糊,本次特别予以总结。不是随便写的,真的是用心写的,姑且看吧。

C++命名的强制类型转换也称作新式类型转换,也是C语言类型转换的一个演进。

看一个C语言的类型转换:

1 char *hopeItWorks = (char *)0x00ff0000;

《C++必知必会》一书把该种类型转换描述成“龌龊”,因为这种类型转换相对于C++的类型转换来说力度要大,大到有时你并不清楚具体发生了哪些转换,即有可能转换即使超出了你的期望而没有任何提醒,最终导致程序运行失败。个人观点,该书作者(译者)描述太过于夸张了,C语言是个奔放的语言,其设计理念之一就是:程序员清楚自已在做什么。

 

C++的类型转换其实把C语言类型转换细分了一下,一分为四。(当然,同时兼容老式类型转换)

1、const_cast

该操作符允许添加或移除表达式中类型的const或volatile修饰符:
1 const Person *getEmployee()
2 {
3     // do some thing and return const Person *
4 }
5 Person *anEmployee = const_cast<Person *>(getEmployee()); // C++类型转换
6 Person *anEmployee = (Person *)getEmployee();// C类型转换

上面给出两种类型转换,都是去掉函数所返回指针的const属性,表面上看是一样的,但是如果函数发生改变后,就能看出这两种转换的差异:
1 const Employee *getEmployee() // 返回类型变了
2 {
3     // do some thing and return const Employee *
4 }
5 Person *anEmployee = const_cast<Person *>(getEmployee()); // C++类型转换,编译提示错误
6 Person *anEmployee = (Person *)getEmployee();// C类型转换,编译不提示错误

这里函数返回类型发生改变,在const_cast试图将const Employee * 转换为Employee *时就已经超出了其能力范围,会在编译阶段给出提示,这往往是很有用的,当然,C++可以做到能力更强的类型转换,且向下看。

 

2、static_cast

编译器隐式执行的任何类型转换都可以由static_cast显式完成:
1 double d = 97.0
2 char ch = static_cast<char>d;//没有编译告警

对于从一个较大的算式类型到一个较小类型的赋值,编译器通常产生警告,当我们显式地提供强制类型转换时,警告信息就会关闭。此种类型转换告诉编译器:我想要一个静静的(static)转换,你懂的,请闭嘴。
静态转换常用于基类的指针或引用,转型为一个派生类的指针为引用。
需要注意的是这不是一个非常安全的转换,损失的精度需要程序员去考虑。使用此转换的一个考虑是:可跨平台移植。

3、reinterpret_cast

顾名思义,重新解释。它从位(bit)的角度来看待一个对象,从而允许将一个东西看作另一个完全不同的东西:
1 char *hopeItWorks = reinterpret_cast<char *>(0x00ff0000); // 把int假装成指针
2 int *hopeless = reinterpret_cast<int *>(hopeItWorks);//把char *假装成int *

这是个非常危险的转换,在C++类型转换里面威力也最大,非常容易出错。举个例子,一本横向排版的书,硬是按照竖向排版的方式进行解读,一般是读不出合理的内容。
给出一种几乎是错误的转换:
1 int *ip;
2 char *pc = reinterpret_cast<char *>(ip);
3 std::string str(pc); // 使用pc初始化一个string 对象,很可能出现运行时错误


4、dynamic_cast

顾名思义,动态的转换。大家知道,C++是具有多态特性的,该种转换仅用于对多态类型进行向下转型(也就是说,被转型的表达式的类型,必须是一个指向带有虚函数的类类型的指针)。上面讲的static_cast也可以从基类指换到派生类,但是不安全的。dynamic_cast执行运行期检查工作,来判定转型的正常性,当然是要会出代价的,好比,多态性也会带来性能开销一样。
01 const Shape *getNextShape()
02 {
03     // do some thing and return const Shape *
04 }
05 const Circle *cp = dynamic_cast<const Circle *>(getNextShape());
06 if(cp)
07 {
08     ...
09 }
10 注: Circle类派生于Shape类。


至此,C++四种转换都讲完了。总结一下,C++类型转换其实是对C语言类型转换的细分及扩充(扩充类类型之间的转换)。

《C++Primer》中有一句特别好:强制类型转换关闭或挂起了正常的类型检查。强烈建议程序员避免使用强制类型转换,不依赖强制类型转换也能写出很好的C++程序。

C++强制类型转换及代码示例 C++强制类型转换 阅读详情

相关推荐

综合能源系统多时间尺度优化调度!诸多创新点让你抓住审稿人的心!

主要介绍综合能源系统的设备组成结构,并针对屋顶光伏系统、冷-热-电联供系统中的燃气轮机、燃气锅炉、光伏溴化锂制冷机、卡琳娜余热发电、中央空调系统,以及外网交互系统的配电网与天然气管网交互关系进行数学建模。1) 源-荷-储协同调度:研究屋顶光伏、燃气轮机、燃气锅炉等源侧设备,中央空调、电-热-冷负荷、可平移电负荷、可削减温控负荷等负荷侧资源,以及储能系统、电动汽车等储能侧设备的协同调度,以提高风光消纳能力,满足社会能源需求。通过电转热、电转冷、电转气等多能耦合方式,可进一步促进可再生能源的应用与发展。

weixin_48747334的博客 1488

C语言的命名规范

在C语言中一般并命名的名字都被称为标识符。标识符是指一个字符组成的序列,通常包括变量名、常量名、函数名、程序名等。这些名字的命名都必须符合C语言的规范,否则程序运行是会出现错误。  命名时必须符合以下规定: C语言中严格区分大小写,例如“a“和”A”分别表示两个不同的命名,意义完全不一样。 C语言命名需要以下划线或者字母开头,不能以数字开头。 C语言中命名的名字长度不限,但一般只有前8位有效...

wangprince2017 3944

DBSCAN聚类算法——机器学习(理论+图解+python代码)

一、前言 二、DBSCAN聚类算法 三、参数选择 四、DBSCAN算法迭代可视化展示 五、常用的评估方法:轮廓系数 六、用Python实现DBSCAN聚类算法 一、前言 去年学聚类算法的R语言的时候,有层次聚类、系统聚类、K-means聚类、K中心聚类,最后呢,被DBSCAN聚类算法迷上了,为什么呢,首先它可以发现任何形状的簇,其次我认为它的理论也是比较简单易懂的。今年在python...

huacha__的博客 20万+

【C++从青铜到王者】第二十四篇:C++的类型转换

系列文章目录 文章目录系列文章目录前言一、C语言中的类型转换二、为什么C++需要四种类型转换三、C++强制类型转换1.static_cast类型转换2.reinterpret_cast类型转换3.const_cast类型转换4.dynamic_cast类型转换5.explicit总结 前言 一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转.

森明帮大于黑虎帮的博客 590

ONNX Runtime C# YOLO全链路压测:从300ms到22ms的15个底层优化技巧

摘要:本文分享了工业质检场景下C#调用YOLOv8s ONNX模型的性能优化实战经验。原始单帧推理耗时300ms无法满足产线需求,通过全链路分析定位瓶颈(预处理85ms、推理180ms、后处理30ms)。重点优化措施包括:使用OpenCVSharp CUDA加速预处理(85ms→12ms),开启ONNX Runtime ALL级别图优化,选用TensorRT执行提供程序(180ms→22ms),以及优化内存管理和线程调度。最终实现单帧总耗时22ms±2ms,GPU利用率提升至85%,完整满足产线120块板/

2601_94871597的博客 402

【WRF-FDDA】观测 Obs nudging 的配置与使用说明(中)

WRF-FDDA

WW、forever的博客 281

C++ 强制类型转换

什么是强制类型转换? 强制类型转换,是指显式地把一种类型的对象转换为另一种类型的行为。强制类型转换是危险的行为,但有时候我们又不得不使用强制类型转换。比如,分子分母为整数,但希望执行浮点数除法时,就需要把分子或分母强制转换成浮点数。 int a=1; int b=2; double c=(double)a/b; 旧式的强制类型 C风格的强制类型转换 C语言的强制类型转换格式如下: (type)expression; type是要强制转换的目标类型,express是被转换的对象,如: (double)a;

m0_55464171的博客 2056

黑猫带你学eMMC协议第17篇:超详细的eMMC HS200 & HS400讲解

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 本文大约6000字,主要内容有: 1.什么是emmc hs200/hs400? 2.什么是tuning?tuning的过程又是什么? 3.如何设置才能让emmc进入hs200 mode? 4.如何设置才能让emmc进入hs400 mode? 5.emmc关于HS200/HS400内部结构框图对比。 6.部分个人相关经验总结。

黑猫奥利奥的博客 1万+

C++四种强制类型转换

文章目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C++的区别3 static_cast4 reinterpret_cast5 const_cast6 dynamic_cast6.1 向上转型(Upcasting)6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换

u_hcy2000的博客 1万+

把 ABAP ALV 表头做成两层分组:用 TOP-OF-PAGE 手工绘制双行列标题

摘要:本文介绍了在SAP ALV List中实现双层表头的方法。通过关闭系统默认列标题(no_colhead='X'),在TOP_OF_PAGE事件中手动绘制表头,使用sy-uline和sy-vline绘制线条实现分组效果。关键点包括:1)关闭系统表头;2)在事件处理中分两行输出分组标题和字段名;3)利用系统自动拼接线条的特性绘制表格边框。文中还指出了常见问题如线条自动粘连、颜色不生效等,并提供了完整示例代码和详细解释。这种方法适用于需要对字段进行业务分组的报表场景。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

Android CCodec (十一) Codec2Buffer BufferPool分析

1、序言 2、C2BlockPool分析 3、SimpleC2Component关于BlockingBlockPool的实现 4、总结

给大佬递杯卡布奇诺的博客 4022

【C++】听说了吗,C++引入了四种强制类型转换

如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,转换的前提是类型之间有一定的关联。 2、C++中的类型转换 上面举的例子都是内置类型之间,而内置类型和自定义类型之间、自定义类型和自定义型之间都是可以通过一定的方式互相转换的。| 内置类型和自定义类型之间:在前面的学习中我们经常说:单参数构造函数支持隐式类型转换,多参数也可以通过加进行隐式类型转换。 C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数 构造

小羊的博客 3720

倍福--实现TCP/IP的配置

控制器为CX5120,需要和上位机做通信,选择TCP/IP的通讯方式,本文介绍TCP/IP通信的操作步骤。 目 录 软硬件版本 3 1.1. 倍福Beckhoff 3 1.1.1. 控制器硬件 3 1.1.2. 控制软件 3 1.2. 串口调试助手 3 1.2.1. TCP调试通信助手 3 授权文件 3 2.1 Lib文件 3 2.2. CAB文件 4 PLC程序编写 4 3.1. 引入TCP/IP库文件 4 3.2. Client端程序 5 3.2.1. 建立相关变量 5 3.3.2. 编写连接功能块

weixin_41883890的博客 5730

C++的四种强制类型转换

隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转换:需要用户自己处理,以`(指定类型)变量`的方式进行类型转换。

m0_72532428的博客 1267

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

探索C++类型转换与强制类型转换

1.背景介绍 C++是一种强类型的编程语言,类型安全性是其核心特性之一。类型转换和强制类型转换在C++中具有重要的作用,可以让我们更好地控制数据类型和数据操作。在本文中,我们将深入探讨C++类型转换与强制类型转换的核心概念、算法原理、最佳实践以及实际应用场景。 1. 背景介绍 在C++中,数据类型是一种用于描述数据的抽象,它决定了数据的存储方式、操作方法以及与其他数据类型的关系。类型转换是指...

AI天才研究院 1228

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C++的强制类型转换

C++因为兼容C的特性,对于C中的强制类型转换也是可以利用的 先来叙述强制类型转换的全过程 数据类型排名(从高到低):long double,double,float,unsigned long long int,long long int,unsigned long int,long int,unsigned int,int 有两个规则要注明: /* 规则 1:char、short 和 unsigned short 值自动升级为 int 值。细心的读者可能已经注意到,char、short 和 unsign

遇事不决,问春风 8026

C++之强制类型转换

C++中的强制类型转换是一种将一个数据类型转换为另一个数据类型的操作。在C++中,有四种类型的强制类型转换:静态转换、动态转换、常量转换和重新解释转换。(1)静态转换(static_cast):静态转换是最常用的一种类型转换,它可以在不同但相关的类型之间进行转换,如基本数据类型之间的转换、父类指针向子类指针的转换等。但是需要注意的是,静态转换没有运行时类型检查,因此在进行转换时需要确保类型之间是相关的,否则可能会导致错误。

专注 3031

关于C++四种强制类型转换

其中static_cast还是比较常用于void*类型的转化,reinterpret_cast是和static_cast横向对比的,一般来说。我们定义了一个const,就是不想让其改变,若是我们在代码随便一个地方使用const_cast就能改变常量值,那么对于大的项目来说,可能就完全乱套了。查看运行结果,问题来了,指针p和指针q都是指向a变量的,指向地址相同,而且经过调试发现002CFAF4地址内的值确实由10被修改成了20,这是怎么一回事呢?那么const_cast<>()怎么发挥作用的呢?

m0_73743517的博客 1670

C++_强制类型转换

C++为了规范强制类型转换的可观性与安全性,引入了4种强制类型转换符,他们分别是:static_cast、reinterpret_cast、const_cast、dynamic_cast。

安权_code的博客 1122

【c/c++】类型转换:隐式类型转换、强制类型转换

类型转换是编程中一个常见的现象。在我们进行编码的时候不经意间就发生了,很可能就给我们带来不少bug。所以我们需要了解类型转换以及对应得出现场景。

m0_73726899的博客 2225
上一篇: C++中数据类型
下一篇: C++中的异常处理
seadplus
博客等级 码龄15年 57粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值