static_cast、dynamic_cast、reinterpret_cast和const_c

AUTOSAR从入门到精通-汽车电子电气架构(EEA)(二) 需求的传递并非完全是瀑布式的单向传递,而是双向的,只有被下游接受了的需求才是有效的需求,而且,下游是可以反向对上游提出需求的。当街区的设计完成之后,接下来要做的就是每栋建筑的详细设计,建筑的设计者发布的图纸中规定了房屋的主要结构、所在位置与周边环境的相互关系,以及屋中各种组件的位置与相互之间结合的关系,比如砖混结构、房屋的具体位置和朝向、卧室与客厅的相对位置与尺寸、马桶在卫生间中的位置等,还会对各种建筑材料的选取原则给出具体的标准,比如水泥的标号,钢筋的型号,各种电线的等级要求等等。 阅读详情
关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。

static_cast

用法:static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
  • 用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类表示)时,由于没有动态类型检查,所以是不安全的。
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  • 把空指针转换成目标类型的空指针。
  • 把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volitale、或者__unaligned属性。

dynamic_cast

用法:dynamic_cast < type-id > ( expression )

该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

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将是一个空指针。另外要注意:B要有虚函数,否则会编译出错;static_cast则没有这个限制。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<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); //copile error

D *pd2 = dynamic_cast<D *>(pb); //pd2 is NULL

delete pb;

}

在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错;而使用 dynamic_cast的转换则是允许的,结果是空指针。

reinpreter_cast

用法:reinpreter_cast<type-id> (expression)

type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

该运算符的用法比较多。

const_cast

用法:const_cast<type_id> (expression)

该运算符用来修改类型的const或volatile属性。除了const 或volatile修饰之外, type_id和expression的类型是一样的。

常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

Voiatile和const类试。举如下一例:
class B{

public:

int m_iNum;

}

void foo(){

const B b1;

b1.m_iNum = 100; //comile error

B b2 = const_cast<B>(b1);

b2. m_iNum = 200; //fine
}

上面的代码编译时会报错,因为b1是一个常量对象,不能对它进行改变;使用const_cast把它转换成一个常量对象,就可以对它的数据成员任意改变。注意:b1和b2是两个不同的对象。
ThingsBoard PE专业版解决方案技术文档——温度&湿度 温湿度解决方案 阅读详情

相关推荐

【图像大模型】RIFE实战:如何通过中间流估计实现4K视频的实时插帧优化

本文深入解析了基于深度学习的RIFE视频插帧算法,重点探讨其核心的中间流估计技术如何实现高效精准的帧生成。通过实战教程,详细介绍了针对4K视频的实时处理优化方案,包括环境配置、参数调优及性能瓶颈分析,帮助用户利用消费级显卡将低帧率视频转化为流畅的高帧率体验。

weixin_29093017的博客 455

reinterpret_cast、dynamic_cast、static_cast的使用及注意事项

标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。在C++中,使用数据类型转换时,该怎样选用合适的数据类型转换方式呢?下面分别对这几种转换方法的使用场景做一个说明:1) static_cast使用方法:static_cast &lt; type-id &gt; ( expression )功能:把express...

tiandao2009的博客 7325

望获实时Linux与国产芯片协同:打造LinuxCNC数控机床的全栈国产化方案

本文探讨了如何通过望获实时Linux与飞腾、龙芯等国产芯片的深度协同,为LinuxCNC数控机床打造全栈国产化方案。望获实时Linux通过中断隔离等核心技术,提供亚微秒级确定性响应,解决了传统Linux系统实时性不足的痛点,使LinuxCNC得以稳定驱动高精度机床。该方案实现了从硬件、操作系统到应用软件的全栈自主可控,为工业控制领域提供了高性能、可定制的国产化选择。

weixin_29291069的博客 647

static_cast, dynamic_cast, const_cast, reinterpret_cast和C风格转换(如(int)x)的用法详解

本文对比了几个类型转换函数

weixin_43158544的博客 726

Hcaptcha验证码的‘免浏览器’破解思路:协议分析与N值算法逆向

本文深入解析Hcaptcha验证码的‘免浏览器’破解思路,通过协议分析与N值算法逆向,实现高效自动识别。文章详细拆解Hcaptcha的API交互流程,揭示关键参数`req`和`n`的生成机制,并提供轻量级实现方案,显著降低资源消耗,适用于大规模数据采集等场景。

weixin_30838873的博客 535

【AMD显卡在WIndow10/11部署带GPU支持的深度学习环境(Pytorch-DirectML篇)】

这篇是之前Tensorflow-DirectML的姊妹篇,如果对TF感兴趣的可以搜索我的博文。 首先我们丢一个官网地址,但是官网那个会误导新人如果你按那个操作的话。 https://docs.microsoft.com/en-us/windows/ai/directml/gpu-pytorch-windows 这里用我的方法操作: 首先声明一下,因为我的显卡是AMD RX6600,不带XT(性能和RTX3060 12G版本半斤八两),所以目前没有最新的WSL2驱动,如果有了的话欢迎告知我,所以我这里就.

weixin_44029053的博客 2万+

C++强制类型转换运算符(static_cast、reinterpret_cast、const_cast和dynamic_cast)克服C语言把常量指针转换成非常量指针等风险

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

二进制模----细微行动改变影响世界 427

【教程4>第2章>第18节】 GMSK调制系统的FPGA开发与matlab对比验证

GMSK(高斯最小频移键控)是一种连续相位的频移键控(CPFSK)调制方法,它在数字通信中得到了广泛应用,特别是在移动通信系统中。GMSK通过限制频率偏差的累积来减少带外辐射,并通过使用高斯滤波器对。

FPGA/MATLAB学习教程/源码/项目合作开发 998

static_cast、dynamic_cast、reinterpret_cast、和const_c

static_cast、dynamic_cast、reinterpret_cast、和const_cast 关于强制类型转换的问题,很多书都讨论过,写的最详细的是C++ 之父的《C++ 的设计和演化》。最好的解决方法就是不要使用C风格的强制类型转换,而是使用标准C++的类型转换符:static_cast, dynamic_cast。标准C++中有四个类型转换符:static_cast、dynam

xust999的专栏 544

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 882

SAP Group Reporting入门指南(11)--配置

这里选择的是FS项目目标属性,FS项目有四个目标属性,比如上图配置的是抵消目标属性,所以就去找触发FS项目的抵消目标属性配置的是哪个FS项目,就以这个FS项目作为贷方。这里选择的是FS项目目标属性,FS项目有四个目标属性,比如上图配置的是抵消目标属性,所以就去找源FS项目的抵消目标属性配置的是哪个FS项目,就以这个FS项目作为借方。例如,添加一个包含用于存储百分比的 FS 项的选项。这里选择的是FS项目的角色属性值,如果这里定义了,那么就从FS项目中找到FS项目角色属性值与之匹配的FS项目作为贷方。

bflyfish的博客 568

Vue+Spring Boot全链路时区问题根因与UTC契约方案

时间处理是Web开发中高频却易被忽视的基础能力,其核心在于理解ISO 8601标准、UTC时间戳的绝对性,以及JavaScript Date对象与Java Instant/LocalDateTime的本质差异。前端Date默认按本地时区解析输入,序列化为ISO UTC字符串;后端若用LocalDateTime或遗留Date类型反序列化,会因JVM时区导致隐式偏移——这正是Element UI时间显示错位、前后端时间漂移等现象的技术根源。本文聚焦Vue 2 + Element UI与Spring Boot组合

weixin_34279579的博客 390

OpenClaw与传统AI助手区别,为什么要本地部署

OpenClaw是一款本地部署的开源AI助手框架,与ChatGPT等云端服务相比具有显著优势。它支持完全离线运行,数据隐私性高,所有信息都存储在本地设备上,避免了云端服务的隐私风险。OpenClaw采用模块化设计,可自由定制功能,且无需支付订阅费用,只需一次性硬件投入。推荐在树莓派、迷你主机等设备上部署,最低配置仅需1核CPU和1GB内存。安装过程包含系统初始化、依赖安装、配置设置等步骤,支持通过systemd服务实现开机自启和后台运行。特别适合注重数据安全、需要离线使用或预算有限的用户群体。

一键难忘的博客 1688

[原创](Modern C++)现代C++的关键性概念: 通俗易懂的解释static_cast, dynamic_cast, const_cast和reinterpret_cast

在现代C++编程中, 正确地处理类型转换是非常重要的. C++提供了四种主要的类型转换操作符: static_cast, dynamic_cast, const_cast 和 reinterpret_cast. 本文将分别介绍它们的用途, 适用场景及示例代码.

其实我不是代码教父,我只是猪头三 499

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++类型转换-static_cast、dynamic_cast、reinterpret_cast、和const_c

首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1部分. 隐式类型转换 又称为“标准转换”,包括以下几种情况: 1) 算术转换(Arithmetic conversion) : 在混合类型的算术表达式中, 最宽的数据类型成为目标转换类型。   int ival = 3; double dval = 3.141

oYongDe的专栏 555

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++中强制转换:const_cast(expression)、dynamic_cast(expression)、 reinterpret_cast(expression) 和 static_c

C++ 提供了4种 强制类型转换形式 : (1)dynamic_cast 基本用法: dynamic_cast<type-id> expression 使用场景: a)dynamic_cast可以进行交叉转换 b) 只有在派生类之间转换时才使用dynamic_cast,type-id必须是类指针,类引用或者void*。 c) dynamic_cast是运行时类 型...

weixin_40798471的博客 314

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

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

dynamic_cast,const_cast,static_cast,reinterpret_cast 详解

如果直接指针直接强转,将只能访问虚函数的内容,而不能访问特定类中的特定成员或方法!!!! 强制类型转换运算符:C++有四种强制类型转换符,分别是dynamic_cast,const_cast,static_cast,reinterpret_cast。其中dynamic_cast与运行时类型转换密切相关,在这里我们先介绍dynamic_cast,其他三种在后面介绍。 6.1、dy...

dianxixian1343的博客 169

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

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

chuxinchangcun的博客 2208

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

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

重铸自身根基的博客 1484

C++中的类型转换运算符dynamic_cast、static_cast、const_cast和reinterpret_cast详解

C++中的类型转换运算符零、小序一、dynamic_cast1、关于dynamic_cast2、代码示例二、static_cast1、关于static_cast2、代码示例三、const_cast1、关于const_cast2、代码示例四、reinterpret_cast1、关于reinterpret_cast2、代码示例五、总述 零、小序 C++程序员都知道,C语言中的强制转换和万能转换指针“v...

ISmileLi的博客 725

C++类型转换深度解析:static_cast、dynamic_cast、const_cast、reinterpret_cast实战指南

类型转换是编程语言中处理不同数据类型间相互操作的基础机制,其核心原理是在保持数据语义的前提下实现内存表示的重新解释或数值的变换。在C++中,类型系统作为安全基石,类型转换技术直接关系到程序的内存安全、性能优化与代码可维护性。C++提供了四种命名的强制类型转换操作符——static_cast、dynamic_cast、const_cast和reinterpret_cast,每种都针对特定场景设计,旨在替代C语言中不安全的隐式转换。从编译期确定的算术转换与类层次向上转型,到运行时的多态类型安全探测,再到底层内存

weixin_33901926的博客 467

C++:类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)、RTTI

由于C语言两种类型转换方式都存在缺陷:隐式类型转换会导致诸如数据精度丢失等问题;而显示类型转化代码不清晰。所以C++在兼容C的基础之上,增加了4中强制类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast。 RTTI:Run-time Type identification的简称,即:运行时类型识别。typeid运算符dynamic_cast运算符decltype。

Zhenyu_Coder的博客 1454

【C++】类型转换(static/reinterpret/const/dynamic_cast)

C++类型转换机制解析 C++提供了两种类型转换方式:隐式转换(编译器自动完成)和显式强制转换。传统C风格强制转换存在可读性差、安全性低等问题。C++引入了四种新的类型转换操作符:static_cast用于相关类型转换,reinterpret_cast用于不相关类型的位模式重解释,const_cast用于去除const属性,dynamic_cast用于安全的向下转型(需父类含虚函数)。这些新转换方式提高了代码可读性和安全性,能有效避免越界访问等潜在问题。特别是dynamic_cast会在转换前进行检查,失败

wefg1的博客 668

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
上一篇: VC常用数据类型转换
下一篇: CString 操作指南
primer_programer
博客等级 码龄20年 283粉丝 180原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值