C++四种强制类型转换符功能以及用法总结(dynamic_cast,const_cast,static_cast,reinterpret_cast)

强制类型转换的原理和使用方法 强制类型转换是一种在编程中常用的操作,用于将一个数据类型转换为另一个数据类型。总结起来,强制类型转换是一种常用的编程操作,用于将数据从一种类型转换为另一种类型。但是,需要注意的是,在进行强制类型转换时应谨慎考虑可能的数据丢失或不一致性。此外,强制类型转换还可以用于将一个复杂的数据类型转换为另一个复杂的数据类型,如将一个对象转换为另一个对象。例如,将一个浮点数转换为整数时,小数部分将被舍弃。例如,将一个整数转换为字符串,或者将一个字符串转换为整数。例如,将一个整数转换为浮点数,或者将一个浮点数转换为整数。 阅读详情



const_cast:

用法:const_cast<type_id> (expression)
该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。
一、指向常量的指针被转化成指向非常量的指针,并且仍然指向原来的对象;
二、指向常量的引用被转换成指向非常量的引用,并且仍然指向原来的对象;
Voiatile和const类似。举如下一例:
class B
{
public:
int m_iNum;
B() {}
};
void foo()
{
const B b1;
//b1.m_iNum = 100; //compile error
/* 可以做如下转换,体现出转换为指针类型 */
B *b2 = const_cast<B*>(&b1);
/* 或者左侧也可以用引用类型,如果对b3或b4的数据成员做改变,就是对b1的值在做改变 */
B &b3 = const_cast<B&>(b1);
b2 -> m_iNum = 200; //fine
b3.m_iNum = 300;//fine
}
int main()
{
foo();
return 0;
}
上面的代码编译时会报错,因为b1是一个常量对象,不能对它进行改变;
使用const_cast可以返回一个指向非常量的指针(或引用)指向b1,就可以通过该指针(或引用)对它的数据成员任意改变。

reinterpret_cast是C++里的 强制类型转换符。
操作符修改了 操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行 二进制转换。
例如:int *n= new int ;
double *d=reinterpret_cast<double*> (n);
在进行计算以后, d 包含无用值. 这是因为 reinterpret_cast 仅仅是复制 n 的比特位到 d, 没有进行必要的分析。


reinterpret_cast:

static_cast和reinterpret_cast的区别主要在于 多重继承,比如
class A
{
public:
int m_a;
};
class B
{
public:
int m_b;
};
class C : public A, public B {};
那么对于以下代码:
C c;
printf("%p, %p, %p", &c, reinterpret_cast<B*>(&c), static_cast <B*>(&c));
前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为 static_cast计算了父子类 指针转换的 偏移量,并将之转换到正确的地址(c里面有m_a,m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换。
因此, 你需要谨慎使用 reinterpret_cast.

static_cast

用法:static_cast < type-id > ( expression )
该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
①用于类层次结构中基类(父类)和 派生类(子类)之间指针或引用的转换。
进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
②用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
③把空指针转换成目标类型的空指针。
④把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
C++中static_cast和 reinterpret_cast的区别
C++primer第五章里写了 编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释
1、C++中的static_cast执行非 多态的转换,用于代替C中通常的转换操作。因此,被做为隐式类型转换使用。比如:
int i;
float f = 166.71;
i = static_cast<int>(f);
此时结果,i的值为166。
2、C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:
int i;
char *p = "This is an example.";
i = reinterpret_cast<int>(p);
此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,//i 也是指针,整型指针;一个明显的现象是在转换前后没有数位损失。

dynamic_cast < type-id > ( expression )
该运算符把 expression转换成type-id类型的对象。Type-id必须是类的 指针、类的引用或者 void*;
如果type-id是类 指针类型,那么 expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
dynamic_cast 运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类 指针或者引用确实指向一个 派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空 指针(也就是说,基类指针或者引用没有指向一个 派生类对象)。
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时, dynamic_cast和 static_cast的效果是一样的;
在进行下行转换时, dynamic_cast具有类型检查的功能,比 static_cast更安全。
class B{
public:
int m_iNum;
virtual void foo();
};
class D:public B{
public:
char *m_szName[100];
};
void func(B *pb){
D *pd1 = static_cast<D *>(pb);
D *pd2 = dynamic_cast<D *>(pb);
}
在上面的 代码段中,如果pb指向一个D类型的对象,pd1和pd2是一样的,并且对这两个 指针执行D类型的任何操作都是安全的;
但是,如果pb指向的是一个B类型的对象,那么pd1将是一个指向该对象的 指针,对它进行D类型的操作将是不安全的(如访问m_szName),
而pd2将是一个空 指针。

dynamic_cast

可以將基类的指针或引用,转换为派生类的指针或引用
B要有 虚函数,否则会编译出错; static_cast则没有这个限制。
B中需要检测有 虚函数的原因:类中存在虚函数,就说明它有想要让 基类 指针或引用指向 派生类对象的情况,此时转换才有意义。
这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的 虚函数表(关于 虚函数表的概念,详细可见<Inside c++ object model>)中,只有定义了虚函数的类才有虚函数表,
没有定义 虚函数的类是没有 虚函数表的。
另外, dynamic_cast还支持交叉转换(cross cast)。如下代码所示:
class A{
public:
int m_iNum;
virtual void f(){}
};
class B:public A{
};
class D:public A{
};
void foo(){
B *pb = new B;
pb->m_iNum = 100;
D *pd1 = static_cast<D *>(pb); //compile error
D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL
delete pb;
}
在函数foo中,使用 static_cast进行转换是不被允许的,将在编译时出错,而使用 dynamic_cast的转换则是允许的,结果是空指针。


42、多媒体与虚拟现实在艺术和影视领域的创新应用 本文探讨了多媒体与虚拟现实在艺术和影视领域的创新应用,涵盖三个典型案例:影视与人类学融合项目通过协作模式模糊作者与观众界限,推动文化文献的发展;交互式数字短片《分手》利用基于对象的广播技术探索个性化影视体验;威尼斯双年展瑞士馆4D项目则通过虚拟现实技术实现文化遗产的数字化展示。这些案例展示了技术在叙事、用户体验及文化保护中的深度应用,并展望了未来技术融合、个性化深化与文化遗产传承的发展趋势。 阅读详情

相关推荐

机械革命重装Win11详细教程

通过以上步骤,你可以在机械革命电脑上成功重装Windows 11。虽然整个过程可能看起来有些复杂,但只要你按照步骤逐一进行,就能够顺利完成安装并享受到全新的操作系统带来的便利和性能提升。希望本文能够帮助到你,如果你有任何问题或疑问,请随时联系我们的技术支持团队。

mmoo_python的博客 3131

【C++】四种强制类型转换

静态转换:static_cast、动态转换:dynamic_cast、重新解释:reinterpret_cast、常量转换(去常性):const_cast

lxylxylxy的博客 1万+

基于IP2369与STM32的45W双向PD移动电源设计

USB PD(Power Delivery)是一种面向高功率、智能协商的通用快充协议,其核心在于通过BMC编码在CC线上完成供电能力(PDO)动态匹配与电压/电流精准调控。IP2369作为高度集成的PD协议管理芯片,内置PHY、协议引擎与MOSFET驱动,可卸载MCU实时通信压力;而STM32F103系列凭借低功耗STOP模式与丰富外设,成为电源状态管理与用户交互的理想协处理器。该组合显著提升系统鲁棒性与能效比,适用于便携式移动电源、嵌入式备用电源及PD协议教学验证等场景。本文围绕IP2369配置电阻精度、

weixin_42608299的博客 516

c++中强制类型转换操作符小结--使用

总结:1)static_cast(a)将地址a转换成类型T,T和a必须是指针、引用、算术类型或枚举类型。表达式static_cast ( a ) a的值转换为模板中指定的类型T。在运行时转换过程中,不进行类型检查来确保转换的安全性。2)dynamic_cast(a)完成类层次结构中的提升。T必须是一个指针、引用或无类型的指针。a必须是决定一个指针或引用的表达式。表达式dynamic_cas

君之剑的专栏 746

DeepSpeed Zero3 Offload实战:从GCC版本检查到环境配置的完整避坑指南

本文是一份针对DeepSpeed Zero3 Offload部署的完整避坑指南。针对训练中常见的`AttributeError: ‘DeepSpeedCPUAdam‘ object has no attribute ‘ds_opt_adam`报错,文章深入剖析了其根源在于GCC编译器版本过低。指南提供了从系统GCC版本深度探查、安全启用高版本GCC环境,到DeepSpeed一致性安装验证的全链路实战方案,旨在帮助用户构建稳定的大模型训练环境。

weixin_29070721的博客 474

【AAAI 2025】轻量级特征增强新范式!FCM 模块助力小目标检测,即插即用提升模型泛化能力

本文介绍了AAAI 2025提出的轻量级特征增强新范式FCM模块,它通过显式分离并双向交互语义与空间特征,有效解决了小目标检测中特征信息失配的核心难题。该模块设计精巧,计算开销极低,能够即插即用式地嵌入YOLO等主流检测网络,显著提升模型对小目标的泛化检测能力,尤其适用于遥感、自动驾驶等对计算资源敏感的实际场景。

weixin_29056145的博客 287

强制类型转换及运算符

显示转换:(数据类型)变量名隐式转换:若运算符两边的类型不匹配,并且没有进行显示指定类型。系统会默认触发隐式的强转。

2402_83966956的博客 804

自制《大侠狂想曲》修改器:内存修改、加速与一键安装全攻略

游戏修改器是玩家优化游戏体验的常用工具,其核心原理是通过内存修改技术,在游戏进程运行时动态改写数值。常见实现路径是借助Cheat Engine扫描并追踪数据地址,再通过编程语言调用系统API完成读写。这种技术能有效解决重复刷资源带来的枯燥感,特别适用于单机RPG中想快速体验多剧情线却不想重刷资源的情形。本文以《大侠狂想曲》为例,完整拆解了从CE定位金钱与好感度内存地址,到编写C#脚本实现游戏加速、一键增加铜钱与NPC好感度,再到用Inno Setup打包生成一键安装器的全过程,并总结了数值弹回、剧情不触发、

weixin_30368981的博客 1464

C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)

C++强制类型转换运算符 将类型名作为强制类型转换运算符的做法是C语言的老式做法,C++ 为保持兼容而予以保留。 C++ 引入了四种功能不同的强制类型转换运算符以进行强制类型转换:static_cast、reinterpret_cast、const_cast 和 dynamic_cast。 强制类型转换是有一定风险的,有的转换并不一定安全,如把整型数值转换成指针,把基类指针转换成派生类指针,把一...

teleger的博客 2467

从零到一:STM32CubeMX虚拟串口开发中的常见陷阱与优化策略

本文深入探讨了STM32CubeMX在USB虚拟串口开发中的常见问题与优化策略,涵盖数据流吞吐量瓶颈、实时性约束等核心挑战。通过实战案例和代码示例,详细解析了波特率同步异常、数据丢失等问题的解决方案,并提供了DMA配置和中断优先级调优的高级技巧,帮助开发者提升STM32虚拟串口的性能和可靠性。

weixin_29164185的博客 370

手把手教你搞定爱思唯尔LaTeX投稿:从模板到PDF生成的全流程避坑指南

本文详细介绍了使用LaTeX投稿爱思唯尔期刊的全流程避坑指南,包括模板选择、文件结构规范、投稿系统文件上传策略、PDF生成与检查等关键步骤。特别强调了避免常见错误如宏包冲突、图片丢失和参考文献问题,并提供了投稿后的应急方案和高阶自动化校验脚本,帮助研究者顺利完成投稿。

weixin_42525289的博客 510

c++中的四种cast转换, dynamic_cast、static_cast、const_cast、reinterpret_cast

C++11之后,C++中就有四种类型转换,分别是 dynamic_cast、static_cast、const_cast、reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。

qq_41841073的博客 7858

英飞凌 AURIX TC3XX 系列单片机的 NVM-Flash 介绍

简单介绍英飞凌 AURIX TC3XX 系列多核单片机的 Flash,便于快速上手使用

大橙子的博客 6639

const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别

const_cast,dynamic_cast,reinterpret_cast,static_cast四种转换的区别一,const_cast一,dynamic_cast一,reinterpret_cast一,static_cast C++是一种强类型语言,对类型的检查非常严格,我们可以使用C语言中的(NewType)Expression来对某个变量或者表达式返回值进行强转,也可以使用C++中提供...

bajianxiaofendui的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++的四种强制类型转换详解,static_cast,reinterpret_cast,dynamic_cast,const_cast,C语言的隐式,显式类型转换详解

因为C++最重要的一个特性就是面向对象编程,对象就是由类构造而成的,C++有各种各样自定义的类,基类,派生类等等之间的转换强制使用以前的C风格转换不安全,简单点说,C++提供了四种更为安全规范的强制类型转换,分别为static_cast,reinterpret_cast,dynamic_cast,const_cast。说起C++的类型转换,必须首先的说C风格的类型转换,因为C++兼容C语言,C语言有两种类型转换,一种隐式的,一种显式的。重新解释类型(挂羊头,卖狗肉) 不同类型间的互转,数值与指针间的互转。

liu20000505的博客 2301

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【c++】c++的四种类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast)

前言 一、c语言中的类型转换 隐式类型转换 强制类型转换 const常变量的强制类型转换 总结 二、c++的四种类型转换 static_cast reinterpret_cast const_cast dynamic_cast 三、RTTI 总结

重铸自身根基的博客 1486

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C++四种类型转换 static_cast , reinterpret_cast ,const_cast ,dynamic_cast

介绍C++的四种类型转换,static_cast ,printerpret_cast,const_cast,dynamic_cast

2301_77509762的博客 1659

C++ 四种类型转换详解:static cast、dynamic cast、const cast、reinterpret cast 的使用场景

转换 | 编译期检查 | 运行期检查 | 类型安全性 | 主要限制 || 是 | 否 | 中 | 不能移除 const、不能转换无关类型 || 是(部分) | 是 | 高 | 必须有虚函数,有 RTTI 开销 |const_cast| 是 | 否 | 低 | 只能修改 const/volatile 属性 || 否 | 否 | 极低 | 几乎无约束,高度不可移植 |是日常使用最频繁的转换,处理编译期可验证的相关类型转换。记住它的“向下转型”是不安全的,除非你能确定实际类型。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 540

C++ :C++ 的四种强制类型转换 static_cast、dynamic_cast、const_cast、reinterpret_cast

在上面所有形式中,e 的类型必须符合以下三个条件中的任何一个:e 的类型是是目标类型 type 的公有派生类、e 的类型是目标 type 的共有基类或者 e 的类型就是目标 type 的的类型。前两个的输出值是相同的,最后一个则会在原基础上偏移 4 个字节,这是因为 static_cast 计算了父子类指针转换的偏移量,并将之转换到正确的地址(c 里面有 m_a,m_b,转换为 B * 指针后指到 m_b 处),而 reinterpret_cast 却不会做这一层转换。这种转换的安全性也要开发人员来保证。

weiweiqiao的专栏 3607

C++ : 四种类型转换(static_cast,reinterpret_cast,const_cast,dynamic_cast)

综上,我们可以看到隐式类型转换的缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换,c++提出了自己的四种转换,可以有效的处理这些问题。,它在静态区开空间进行存储数据,变量被const进行修饰具有常性,数据不可以被修改,但是我们可以通过类型转换,通过指针去修改它存储的数据的值,但是这种修改数据的值的方式是存在安全隐患的,因为我们使用const进行修饰变量,就是不希望数据被修改。关键字进行修饰变量,被volatile修饰的变量,编译器在取它的值的时候,每次都会去内存中去取。

2402_87310323的博客 1149

[C++] 类型转换操作符(static_cast、dynamic_cast、const_cast、reinterpret_cast)

说明:本文主要解释static_cast、dynamic_cast、const_cast、reinterpret_cast这几种类型转换操作符。接下来我们对每一个类型转换操作符进行详细说明并给出一些基本的使用方式,重在深入理解。在解释类型转换操作符之前,我们先了解下,为什么要引入类型转换操作符?C语言本身就支持请值类型转换,那么C++为什么还要引入类型转换操作符呢,其实C++中引入类型转换操作符的设计目的是为了增强类型安全性和程序可靠性。

wangdsh的博客 1625

C++四种类型转换操作符 static_cast、dynamic_cast、reinterpret_cast、const_cast介绍

C风格的强制类型转换很简单,都可以使用Type b = (Type)a形式转换。但这种方式存在一些缺点,比如信息丢失或精度损失,代码可读性的下降等。因此C++提供了四种类型转换符来应对不同场合。分别是static_cast、dynamic_cast、reinterpret_cast、const_cast。

new9232的博客 1581

C++类型转换运算符(dynamic_cast,const_cast,static_cast,reinterpret_cast)

RTTI是运行阶段类型识别的简称。

2301_80224556的博客 1111

【C++类型转换】static_cast、dynamic_cast、const_cast、reinterpret_cast

中,并在后续标准(C++11/14/17/20)中保持稳定。这四大类型是 C++ 对 C 风格强制转换的现代化、安全化替代方案。在 C 语言中,类型转换通常使用。enum 与整型之间。

普罗米修斯的博客 694

static_cast、dynamic_cast、const_cast和reinterpret_cast(四种类型转换运算符)

C/C++类型转换的本质 在 C/C++ 中,不同的数据类型之间可以相互转换:无需用户指明如何转换的称为自动类型转换(隐式类型转换),需要用户显式地指明如何转换的称为强制类型转换(显式类型转换)。 隐式类型转换利用的是编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换函数(这些都可以认为是已知的转换规则),例如从 int 到 double、从派生类到基类、从type *到void *、从 double 到 Complex 等。 type *是一个具体类型的指针,例如int *、double *、

mj348940862的博客 1157

【C++】类型转换-static_cast、reinterpret_cast、const_cast、dynamic_cast

上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针.const属性被去掉以后,会被修改!dynamic_cast只能用于含有虚函数的类,因为运行时类型检查需要运行时的类型信息,而这个信息是存储在虚函数表中的,只有定义了虚函数的类才有虚函数表.当然可以使用强制转换,这种转换时不安全的,会导致数据的丢失,原因是父类的指针或者引用的内存中可能不包含子类的成员的内存。

chuxinchangcun的博客 2208
上一篇: 处世态度(有空的时候拿出来读一下)
下一篇: typeid为type_info友元函数
SprintfWater
博客等级 码龄15年 242粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值