【转载】C++运算符之类型转换

C++双目/单目运算符的重载 双目运算符重载 1.1格式: L/左操作数/ # /操作符/ R/右操作数/ L#R => L.operator#(R) 成员形式,写在类中,成员函数形式 => operator#(L,R) 非成员形式 //需要定义为类的友元函数 如: cout 《 c1; => cout.operator《(c1) => operator《(cout,c1) 1.2实际操作形式: 类... 阅读详情
一、const_cast:只影响类型修饰符const,volatile
用法:const_cast<type_id>(expression)

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

  • 常量指针被转化成非常量指针,并且仍然指向原来的对象;
  • 常量引用被转换成非常量引用,并且仍然指向原来的对象;
  • 常量对象被转换成非常量对象。
二、static_cast:
  • 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  • 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证。
  • 把空指针转换成目标类型的空指针。
  • 把任何类型的表达式转换成void类型。
注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。
C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。

三、reinterpret_cast:
  • 操作符修改了操作数类型,但仅仅是重新解释了给出的对象的比特模型而没有进行二进制转换。
  • 所有映射中最危险的
  • static_cast和reinterpret_cast的区别主要在于多重继承,比如

  1. <span style="font-size: 18px;">classA { public: int m_a;}; 
  2. classB { public: int m_b;}; 
  3. classC : public A, public B {};</span> 
classA { public: int m_a;};
classB { public: int m_b;};
classC : public A, public B {};

  那么对于以下代码:

  1. <span style="font-size: 18px;">C c; 
  2. printf("%p,%p, %p\r\n", &c,              
  3.                         reinterpret_cast<B*>(&c), 
  4.                         static_cast<B*>(&c)  );</span> 
C c;
printf("%p,%p, %p\r\n", &c,             
                        reinterpret_cast<B*>(&c),
                        static_cast<B*>(&c)  );

  前两个的输出值是相同的,最后一个则会在原基础上偏移4个字节,这是因为static_cast计算了父子类指针转换的偏移量,并将之转换到正确的地址(c里面有m_a, m_b,转换为B*指针后指到m_b处),而reinterpret_cast却不会做这一层转换。


四、dynamic_cast:

  • dynamic_cast运算符可以在执行期决定真正的类型。如果downcast是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果downcast不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。
  • 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
  • 进行向下类型转换时,必须是一个指向带有虚函数的类类型的指针。这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表,只有定义了虚函数的类才有虚函数表。
  • 使用dynamic_cast要付出显著地运行开销和内存开销。
可以参考下面这个例子进行理解:

  1. <span style="font-size: 18px;">Base b; 
  2. 00291A8B  lea         ecx,[b]   
  3. 00291A8E  call        Base::Base (291131h)   
  4. Base* pb = NULL; 
  5. 00291A93  mov         dword ptr [pb],0   
  6.  
  7. Derived d; 
  8. 00291A9A  lea         ecx,[d]   
  9. 00291A9D  call        Derived::Derived (2911C7h)   
  10. Derived* pd = NULL; 
  11. 00291AA2  mov         dword ptr [pd],0   
  12.  
  13. pb = &d; 
  14. 00291AA9  lea         eax,[d]   
  15. 00291AAC  mov         dword ptr [pb],eax   
  16. pd = static_cast<Derived*>(pb); 
  17. 00291AAF  mov         eax,dword ptr [pb]   
  18. 00291AB2  mov         dword ptr [pd],eax   
  19.  
  20. pd = dynamic_cast<Derived*>(pb); 
  21. 00291AB5  push        0   
  22. 00291AB7  push        offset Derived `RTTI Type Descriptor' (29A018h)   
  23. 00291ABC  push        offset Base `RTTI Type Descriptor' (29A000h)   
  24. 00291AC1  push        0   
  25. 00291AC3  mov         eax,dword ptr [pb]   
  26. 00291AC6  push        eax   
  27. 00291AC7  call        @ILT+640(___RTDynamicCast) (291285h)   
  28. 00291ACC  add         esp,14h   
  29. 00291ACF  mov         dword ptr [pd],eax   
  30. </span> 
Base b;
00291A8B  lea         ecx,[b]  
00291A8E  call        Base::Base (291131h)  
Base* pb = NULL;
00291A93  mov         dword ptr [pb],0  

Derived d;
00291A9A  lea         ecx,[d]  
00291A9D  call        Derived::Derived (2911C7h)  
Derived* pd = NULL;
00291AA2  mov         dword ptr [pd],0  

pb = &d;
00291AA9  lea         eax,[d]  
00291AAC  mov         dword ptr [pb],eax  
pd = static_cast<Derived*>(pb);
00291AAF  mov         eax,dword ptr [pb]  
00291AB2  mov         dword ptr [pd],eax  

pd = dynamic_cast<Derived*>(pb);
00291AB5  push        0  
00291AB7  push        offset Derived `RTTI Type Descriptor' (29A018h)  
00291ABC  push        offset Base `RTTI Type Descriptor' (29A000h)  
00291AC1  push        0  
00291AC3  mov         eax,dword ptr [pb]  
00291AC6  push        eax  
00291AC7  call        @ILT+640(___RTDynamicCast) (291285h)  
00291ACC  add         esp,14h  
00291ACF  mov         dword ptr [pd],eax  



YOLO11涨点优化:半监督学习 | 结合Unbiased Teacher框架,利用海量无标签数据实现自训练暴力涨点 本文提出了一种基于Unbiased Teacher v2的半监督学习方法,用于解决YOLO11目标检测模型在标注数据不足时的性能瓶颈问题。通过分析纯监督YOLO11在小样本场景下的局限性,揭示了朴素自训练方法的三大陷阱:确认偏差、类别不均衡和噪声累积。文章详细解析了Unbiased Teacher框架的核心设计理念,包括教师-学生模型互监督机制、类别平衡损失和Burn-In预热策略,并重点介绍了v2版本针对无锚框检测器的优化。最后提出将Unbiased Teacher与YOLO11相结合的融合架构设计方案, 阅读详情

相关推荐

FineReport V11.0安装避坑指南:从下载到激活的完整流程(附百度网盘链接)

本文提供FineReport V11.0从下载、安装到激活的完整避坑指南。详细解析了部署前的环境准备、安装过程中的JVM内存等核心配置、激活流程以及安装后的优化与常见问题排查,旨在帮助用户一次部署成功,确保企业级报表平台的稳定运行。

echo99的专栏 1197

C++运算符之类型转换

一、const_cast:只影响类型修饰符const,volatile 用法:const_casttype_id>(expression)     该运算符用来修改类型的const或volatile属性。除了const或volatile修饰之外,type_id和expression的类型是一样的。 常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍

imyfriend的专栏 2418

VS2022离线环境下的NuGet包管理:从本地源到依赖项全解析

本文详细解析了在VS2022离线环境下如何高效管理NuGet包,包括搭建本地NuGet源的两种方案(本地文件夹源和私有NuGet服务器)、获取离线包的三大渠道以及依赖项处理的实战技巧。通过自动化脚本和依赖树分析工具,帮助开发者解决离线环境中的依赖项黑洞问题,提升开发效率。

5f4d3s2a1q的博客 1061

慎用const_cast

转自:http://blog.solrex.cn/articles/%E6%85%8E%E7%94%A8const_cast.html Program: #include <iostream> using namespace std; int main() { const int a = 1; int *p = const_cast<int*>(&a)...

weixin_30632883的博客 336

数字设计实验:RISC-V指令单周期CPU

本文旨在介绍RISC-V指令单周期CPU的设计思路和仿真实现(含代码)

2401_83740084的博客 2717

Ollama+FAISS+Embedding+Rerank+LLM 详细部署指南

下载安装Ollama 双击运行安装程序 安装完成后会自动启动服务 修改默认安装路径(避免C盘爆满) 或使用PowerShell: 验证安装 Linux系统部署: (二)准备模型 1. 拉取Embedding模型 2. 拉取LLM模型 注意:原文中提到的可能需要从自定义仓库拉取: 3. 下载Rerank模型 (三)安装依赖库 创建项目目录和虚拟环境: 二、主要功能实现 项目结构 (一)配置文件(config/config.yaml) (二)文本分块策略实现 创建 : (三)文档读取

AI技术改变世界 1583

const_cast<type-id>(expression)

//**********************// 类类型 classB{ public: intm_num; B():m_num(50){} };...

weixin_34220963的博客 143

【MIMIC数据库教程】一、MIMIC-IV3.1表格与字段详解(一):Hosp和ICU模块表格整体介绍

MIMIC-IV 3.1 版本包含住院 (hosp) 和 重症监护 (ICU)提供全院电子病历数据,包括入院信息、实验室测量、微生物学、用药、账单等,共计22 张表。记录重症监护室数据,如静脉注射、呼吸机设置、生命体征等,共计9 张表。

BD_Design_cs的博客 3425

类型转换运算符

c++中4个类型转换运算符: dynamic_cast const_cast static_cast reinterpret_cast 可以根据目的选择一个适合的运算符,而不是使用通用的类型转换。 1、dynamic_cast 假设High和Low是两个类,而ph和pl的类型分别为High* 和Low*,则仅当Low是High的可访问基类(直接或间接)时,下面的语句才将一个Low*指针赋给pl: 否则,该语句将空指针赋给pl。 该运算符的用途是,使得能够在类层次结构中进行向上转换(由于is-a关系,

neko233的博客 1029

基于Xilinx_IBERT的光纤接口眼图测试

基于Xilinx_IBERT的光纤接口眼图测试

Coca_Tian的博客 1万+

windows的rancherDesktop修改镜像源

Rancher Desktop中的“Allowed Images”功能(通常在 Preferences -> Container Engine -> Allowed Images 中找到)是用来定义一个允许拉取和推送的镜像列表的规则,例如,只允许从您组织或特定的受信任的仓库中获取镜像。如果问题依旧,请提供您Rancher Desktop的版本和当前选择的容器运行时,以便进一步协助。总结一下,对于Windows上的Rancher Desktop,如果您使用默认的。,镜像源的配置通常通过一个名为。

zwjapple的专栏 2700

类型转换,常用运算符

什么是自动类型转换,为什么要学习自动类型转换 类型范围小的变量,可以直接复制给类型范围大的变量 存在不同类型的变量赋值给其他类型的变量 自动类型转换的底层原理 byte a =12; int b =a; 在表达式中,小范围类型的变量会自动转成大范围类型的再运算byte、short、char ——>int——>long——>float——>double表达式的最终结果类型由表达式中的最高类型决定在表达式中byte,shor

m0_53016507的博客 690

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

(转载)C++的四个类型转换运算符

转自:http://hi.baidu.com/waslin/blog/item/2fec8d516c30bc878d543069.html   reinterpret_cast 该函数将一个类型的指针转换为另一个类型的指针. 这种转换不用修改指针变量值存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可做到. reinterpret_cast 可以将指针值转换为一个整型数,但

kjing的专栏 1645

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

VC中sqlite的使用

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

面向对象程序设计-C++ Operator Overloading & Type conversion (Static)【第十一次上课笔记】...

本次上课继续讲解了 [ ] 、-> 等运算符重载的具体例子 也讲解了C++单个参数的类的类型转换的案例 最后稍微提到了 static 的第三种作用:静态数据成员 具体详解我都已注释出来了,大家可以慢慢看 有任何问题都可以在这篇文章下留言我会及时解答 :) #include <iostream> #include <cmath> u...

weixin_30511107的博客 130

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C++:类型转换运算符

最近发现自己对这个知识点理解的模棱两可,特做笔记如下。 转载自:笔记:类型转换运算符_酒红的专栏-优快云博客_类型转换运算符 略有删改。 类型转换运算符(conversion operator)是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型。类型转换函数的一般形式是: operator type() const; 其中,type表示转换目标类型,除了void、数组或函数类型,但允许转换成指针(包括数组指针及函数指针)。类型转换运算符既没有显式的返回类型,也没有形参,而且必须定.

weiyuanzhang123的博客 1271

C++中类型转换运算符的使用方法

详细介绍C++中类型转换运算符的使用方法   转载http://developer.51cto.com/art/201107/277241.htm C++的四个类型转换运算符已经有很久了,但一直没有弄清楚它们的用法,今天看到一本书上的解释,才大致地的了解了其具体的用法. 具体归纳如下: reinterpret_cast 函数将一个类型的指针转换为另一个类型的

学而知不足 645

cpp 4个类型转换

static_cast、dynamic_cast、reinterpret_cast、const_cast 之间的区别 static_cast 用法:static_cast (expression) 说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。 用途: 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指...

weixin_33984032的博客 1045

C++运算符重载与类型转换

1.基本概念 当运算符被用于类类型对象时,C++语言允许我们为其指定新的含义,同时,我们也可以自定义类类型之间的转换规则。 以下是运算符重载时需要注意的几个原则: 当运算符作用于内置类型对象时,我们无法改变该运算符的含义 我们只能重载已存在的运算符,不能发明新...

BJJXZ31 303

[转]C++重载()(强制类型转换运算符)

在C++中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符。类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数。经过适当重载后,(类型名)对象这个对对象进行强制类型转换的表达式就等价于对象.operator 类型名(),即变成对运算符函数的调用。下面的程序对 double 类型强制转换运算符进行了重载。 #include <i...

weixin_34217711的博客 278

嵌入式实时系统时间确定性:中断、任务与抖动三要素解析

在嵌入式实时控制系统中,时间确定性是保障功能安全与控制精度的核心基础。其本质并非单纯依赖高频率时钟,而是由中断响应的可预测性、RTOS任务调度的严格优先级约束,以及端到端抖动的量化管控共同构成。中断作为物理世界与软件的时间锚点,其传播延迟、抢占行为与屏蔽机制直接决定最小时间分辨率;任务调度则需规避时间片轮转、动态内存与浮点运算等非确定性操作;而抖动——尤其是相位抖动——实为系统健康状态的体温计,反映软硬件协同的真实时序质量。本文结合STM32、Zynq等主流平台实战案例,深入剖析中断响应延迟、任务优先级拓扑

weixin_34391445的博客 382

C++ 显式类型转换(转载)

static_cast, dynamic_cast, const_cast, reinterpret_cast

Mason___的博客 209

C++的运算符(三)—— () , {}(类型转换)

目录文章:C++中运算符的优先级   C++中有三种类型转换运算符:(type)name,type(name),type{name}。 其中,第一种叫做C风格转换运算符,第二种和第三种叫做函数风格转换运算符。 在类型名为long long、unsigned int、long double这样的中间带空格的名称时,需要在外面加一层小括号。 在转换的表达式的优先级低于类型转换运算符时,需要在...

zgq的博客 666

C++:条件运算符: ? :

C++:条件运算符: ? :语法备注示例 语法 expression ? expression : expression 备注 条件运算符 (?:) 是三元运算符, (它采用三个操作数) 。 条件运算符按以下方式运行: 第一个操作数将隐式转换为 bool 。 计算该操作数,并在继续前完成所有副作用。 如果第一个操作数的计算结果为 true (1) ,则计算第二个操作数。 如果第一个操作数的计算结果为 false (0) ,则计算第三个操作数。 条件运算符的结果是操作数(无论是第二个还是第三个)的计算结果。

it_cplusplus 2350

C++ 四种 类型转换

转载自:https://www.cnblogs.com/Allen-rg/p/6999360.html C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。 (1)将浮点型数据赋值给整型变量时,舍弃其小数部分。 (2)将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。 (...

sgh666666的博客 1903

C++类型转换运算符重载

在C++中有一个特殊的运算符重载方法--类型转换运算符重载,形如:operatortype(); Code classCDemo{ public: CDemo(intx,inty){ this->_x=x; this->_y=y; } operatorint(){//运算符重载 ...

weixin_30911809的博客 119

C++类型转换运算符

C++中提供4中类型转运算符,分别是:static_cast、dynamic_cast、reinterpret_cast和const_cast; 语法格式如下: 类型转换运算符 < type_id> (expreession); 说明:type_id是目标类型;expression是原数据。 1、dynamic_cast:主要用于类层次间的上行转换和下行转换。当在类层...

ab553906660的博客 166
上一篇: 7PYX 网站代码下载
下一篇: 超级玛丽游戏 C++简单实现
普通网友
博客等级 码龄22年 1万+粉丝 3156原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值