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

C++四种cast的详细介绍 C++的四种case 阅读详情

一、C语言类型转换

 在C中支持类型转换, 分为隐式类型转换和显示类型转换。但C中类型转换不是非常规范不规范,存在以下问题:

  1. 隐式类型转换:编译器在编译阶段自动转换。如果不能转换,编译失败。
  2. 显示类型转换:用户自己处理。

二、C++新增强制类型转换

 由于C语言两种类型转换方式都存在缺陷:隐式类型转换会导致诸如数据精度丢失等问题;而显示类型转化代码不清晰。所以C++在兼容C的基础之上,增加了4中强制类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast。

2.1 新增类型转换:static_cast

 static_cast用于非多态的类型的转化,即静态转化。static_cast和C中的隐式类型转换类似,编译器会自动进行类型转换。如果不能转换,则编译失败!

int main()
{
	double d = 123.12l;
	int i = static_cast<int>(d);
	return 0;
}

2.2 新增类型转换: reinterpret_cast

 reinterpret_cast对标的是C中的显示类型转换。需要注意的是显示类型转换通常会伴随风险,使用reinterpret_cast不会进行类型安全检查。

int main()
{
	int i = 3;
	//int* p = static_cast<int*>(i); //error
	int* p = reinterpret_cast<int*>(i);
	return 0;

2.3 新增类型转换:const_cast

 const_cast用于去除变量的const属性,使变量能够进行赋值操作。
【实例】:

int main()
{
	const int i = 2;
	int* p = const_cast<int*>(&i);//删除常变量i的const属性
	(*p)++;


	//cout << i << ":" << *p << endl;
	printf("i=%d, *p=%d\n", i, *p);
	return 0;
}

在这里插入图片描述

  • 既然我们已经使用const_cast删除了变量i的const属性,为什么这里i的结果认为2?
  • 原因在于编译器的优化。当一个变量为const属性时,编译器认为该变量不在被修改,所以会用一个寄存器直接保存该变量的结果;或者在编译阶段直接类似宏替换,将i替换为2。

所以我们可以通过关键字volatile禁止编译器对常变量的优化!!

int main()
{
	volatile const int i = 2;
	int* p = const_cast<int*>(&i);//删除常变量i的const属性
	(*p)++;


	//cout << i << ":" << *p << endl;
	printf("i=%d, *p=%d\n", i, *p);
	return 0;
}

在这里插入图片描述

  1. 这里输出时不要用cout。原因在于这里使用volatile后,由于C++标准输出库存在缺陷,没有匹配到正确的重载函数。

2.4 新增类型转换:dynamic_cast

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

  1. 向上转换:子类对象指针/引用->父类指针/引用(我们认为该过程是天然的,不产生临时变量。通过赋值兼容规则(切片)直接将子类对象指针/引用给父类指针/引用)
  2. 向下转换:父类指针/引用->子类对象指针/引用。这种情况下,如果直接强转类型,可能回到住越界访问的风险。而dynamic_cast则可以避免该问题。(具体看实例)

tips:

  • dynamic_cast只能用于父类含有虚函数的类!!
  • dynamic_cast会先检查能否转换成功。如果能成功,则进行转换。否则返回一个空指针!!
void func(A* pa)
{
	//不安全, 原因在于如果是一个A类型的指针转递给pa,此时后续访问_b是发生越界访问
	//B* ptr = (B*)pa;

	//使用dynamic_cast,如果将A类型的指针转递给pa会转换失败,返回空指针
	//而将B类型的指针转递给pa, 转换成功,恢复到原始状态
	B* ptr = dynamic_cast<B*>(pa);
	if (ptr)
	{
		ptr->_a++;
		ptr->_b++;
		cout << ptr->_a << ":" << ptr->_b << endl;
	}
	else
	{
		cout << "转换失败" << endl;
	}
}

int main()
{
	A a;
	B b;
	cout << "B b -> func(&a):" << endl;
	func(&a);//转换失败
	cout << endl;

	cout << "A a -> func(&b):" << endl;
	func(&b);
	return 0;
	return 0;
}

在这里插入图片描述

三、 什么是RTTI ?

 RTTI:Run-time Type identification的简称,即:运行时类型识别。C++通过以下方式来支持RTTI:

  1. typeid运算符
  2. dynamic_cast运算符
  3. decltype
C++(03): static_cast static_cast比较接近于C语言中的强制转换,多用于不同的基本数据类型的转换: 他可以将空指针转换为目标类型的指针,或反之: 但不能对不同类型的指针进行转换: 更不能将整数转换为指针或反之: 对于自定义类型,如果类定义转型运算符,那么也可以通过static_cast对类对象进行转型: 对于自定义类型的指针,通过static_cast,将派生类指针转换为基类指针是安全的;反之,将基类指针转换为派生类指针是不安全的(建议类指针之间的转换都通过dynamic_cast进行)。... 阅读详情

相关推荐

VOWIFI--相关的协议文档

一、3GPP相关协议文档 3GPP 23.402 Architecture enhancements for non-3GPP accesse- //重要 整体框架结构和流程,3GPP和NON-3GPP切换 3GPP 36.304  User Equipment (UE) procedures in idle mode //重要,终端在空闲状态下3GPP与NON-3GPP之间的重选方法   3GP

时九博客 3580

C++新特性07_强制转换static_cast(隐式转换:基本等价于隐式转换的一种类型转换运算符,可使用于需要明确隐式转换的地方;大端序、小端序;适用于低风险转换及子类转父类)

1. 隐式转换 在C语言中,存在不通过强制转换就可以将类型进行转换的隐式转换。 例子: int main() { int n = 5; float f = 10.0f; //本质上发生了隐式转换,将int类型的5转换为float类型 f = n; return 0; } 运行结果: 计算机数据存储方式: 计算机数据存储有两种字节优先顺序:高位字节优先(称为大端模式)和低位字节优先(称为小端模式)。 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的

分享学习成长历程,Winter is coming! 7699

UM2 3D 打印机 DIY 实践 (2) 电路篇

涉及到的东西非常多,实际上后面还会讲到。主要部件清单: 主板 mega2560 + Ramps1.4 + LCD12864 各一张 42 x38mm x3,xyz 轴各一台 42 x23mm x1,用在挤出机 泰坦远程挤出机 x1 TMC2225 驱动板 x4, 替代a4988、TMC2208,静音效果好,性价比高 s-250-12v 20A开关电源 x1。功率必须足够大,宁可选大一点的 大功率 MOS 管,25A x1 NTC .

afeiqiang的专栏 3601

【C++】强制类型转换操作符 static_cast

参考: https://www.cnblogs.com/QG-whz/p/4509710.html https://blog.youkuaiyun.com/moruihong/article/details/7712260 一、简介: static_cast是一个强制类型转换操作符。强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast、dynamic_cast、const_cast、reinterpert_cast四个。 用法:static_cast < type-id.

lemonxiaoxiao的博客 1万+

华为手机连接Win11失败?内核隔离与驱动签名冲突的终极解决指南

在Windows操作系统中,驱动程序是硬件与系统通信的桥梁,其数字签名机制是保障系统内核安全的核心防线。基于虚拟化的安全技术通过强制验证驱动签名,能有效隔离恶意代码,提升系统抵御高级威胁的能力。然而,严格的签名策略有时会与部分硬件驱动产生兼容性问题,导致设备无法识别,直接影响文件传输、应用调试等核心工作流。本文聚焦于华为手机在开启Windows 11内核隔离功能时出现的连接故障,深入剖析驱动签名验证与Hypervisor保护的代码完整性原理,并提供从驱动更新、策略调整到无线替代方案的完整解决路径,帮助用户在

weixin_31309419的博客 352

Python 驱动 CAD 二次开发:从零搭建自动化绘图环境

本文详细介绍了如何利用Python进行CAD二次开发,实现自动化绘图。通过win32com库建立Python与CAD软件的通信,文章从环境搭建、连接CAD、操作文档到核心绘图与批量处理,提供了完整的实战指南。该方法能显著提升机械设计、建筑绘图等领域的重复性工作效率,将创造力从繁琐劳动中解放出来。

weixin_29093169的博客 1230

C++基础#22:C++中的静态强制static_cast

与dynamic_cast对应的是static_cast(静态强制)。static_cast关键字一般用来将枚举类型转换成整型,或者短整形转换成长整形,又或者整型转换成浮点型。也可以用来将指向父类的指针转换成指向子类的指针。static_cast可以用于类层次结构中基类和子类之间指针或引用的转换。static_cast仅仅是依靠类型转换语句中提供的信息(尖括号中的类型)来进行转换。

记录和分享程序人生的点点滴滴 1万+

YOLOv8改进策略【卷积层】| GnConv:一种通过门控卷积和递归设计来实现高效、可扩展、平移等变的高阶空间交互操作

HorNet: 利用递归门控卷积实现高效高阶空间交互GnConv(Recursive Gated Convolution,递归门控卷积)

Limiiiing的博客 324

c++的4种类型转换操作符(static_cast,reinterpret_cast,dynamic_cast,const_cast),volatile,RTTI

四种c++类型转换操作符,volatile,RTTI

m0_74206992的博客 451

【华为OD机考真题】- 构成的正方形数量(B卷-100分)(Java版)

🔔本文收录于「最新最全华为OD机试真题(Java版)」专栏,手把手带你零基础教学华为OD机试。本题集提供最优题解思路,解题步骤,代码解析,复杂度分析及最优题解源码等,支持多语言题解,助你轻松拿捏OD机考,一举上岸!安利大家关注&&收藏&&订阅!题库正在疯狂收录中,up!up!up!! 🚫提醒:拒绝一切代考/替考,违法必究!专栏所写题库均精心搜集于互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验所撰,欢迎订阅。    💗订阅福利:一次订阅,可永久免费阅读,提供在线答疑解惑,后续题库更新

**My Coding Family** 1349

SAP 批次管理

批次管理: 业务场景: 批次常用于:采购、生产、SD等: 1、先进先出,先入库的先出库(如何实现),基于入库时间来自动确定出库策略。 2、追塑:基于批次进行产品质量追溯 例如订单MTO ---> PP ----> MM(批次关联)。SO—>PP工单 --> 预留 --> 发料(基于批次A\B\C)-->产成品入库-->批次入库D--> ...

willieyuan的博客 1万+

C++显性契约与隐性规则:类型转换

关于类型转换,通常是隐式转换或者强制转换,C++提供了一些能够显式表示转换的运算符,能够更好的规避一些风险和错误

Zero_VPN的博客 3034

【异常】SpringCloud Gateway报错503 SERVICE_UNAVAILABLE “Unable to find instance for xxx-gen“

网关服务报错,如下。

奶爸的编程之路,也就一周冷个三天 4224

C++类型转换和RTTI

C++中的自定义类型转换允许程序员定义自己的转换规则,以便在不同类型之间进行转换。①转换构造函数:转换构造函数允许将其它类型的数据转换为类类型。它只有一个参数,或者其它参数都有默认值。当遇到需要类型转换的情况时,编译器会自动调用转换构造函数完成隐式转换。②类型转换运算符:operator类型转换运算符允许将类类型转换为其它类型。它没有参数和返回值,且必须被定义为成员函数。语法:operator关键字加要转换的目标类型。

2301_82023822的博客 987

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

C++类型转换

C和C++中的隐式类型转换,以及C++中添加的类型转换模式,static_cast,const_cast,reinterpret_cast, dynamic_cast

qq_74276498的博客 1209

Camera2Demo

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

【C++】类型转换

使用dynamic_cast进行向下转型则是安全的,如果父类的指针(或引用)指向的是子类对象那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象那么dynamic_cast会转换失败并返回一个空指针。上述代码中,如果传入func函数的是子类对象的地址,那么在转换后pb1和pb2都会有对应的地址,但如果传入func函数的是父类对象的地址,那么转换后pb1会有对应的地址,而pb2则是一个空指针。dynamic_cast用于将父类的指针(或引用)转换成子类的指针(或引用)。

m0_70088010的博客 1107

VB摄像头监控

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

C++:类型转换

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

decade777555的博客 828

C++的类型转换

C++的类型转换,什么是static_cast?什么是reinterpret_cast?什么是const_cast?什么是dynamic_cast?什么是RTTI?这一篇文章给你答案!!!

wer24_25的博客 1534

C++四大类型转换详解:从static_cast到reinterpret_cast的安全实践

类型转换是编程语言中处理不同数据类型间操作的基础机制,其核心原理在于在内存层面重新解释或转换数据的表示方式。在C++中,类型系统通过提供精细化的转换操作符来增强类型安全性,这一技术价值在于能够在编译期或运行期捕获潜在的类型错误,从而避免未定义行为和内存访问违规。应用场景广泛,包括类层次结构中的向上/向下转型、常量性处理、底层内存操作以及与遗留代码的交互。本文聚焦于C++的四种类型转换运算符:static_cast用于编译期安全的类型转换,dynamic_cast提供运行时类型检查以实现安全向下转型,cons

weixin_30540691的博客 458

C++进阶--类型转换

而使用dynamic_cast进行向下类型转换则是安全的,如果父类的指针(或引用)指向的是子类对象,那么dynamic_cast会转换成功,但如果父类的指针(或引用)指向的是父类对象,那么dynamic_cast会转换失败并返回一个空指针。2.由于编译器认为const修饰的变量是不会被修改的,因此会将const修饰的变量存放到寄存器当中,当需要读取const变量时就会直接从寄存器中进行读取,而我们修改的实际上是内存中a的值,因此最终打印出a的值是未修改之前的值。

sushang的博客 1258

【C++航海王:追寻罗杰的编程之路】C++的类型转换

【C++航海王:追寻罗杰的编程之路】C++的类型转换

枫叶丹4的博客 1397

C++开发基础——动态类型转换与RTTI

C++语法基础

程序员与背包客_CoderZ 1196

【C++】C++的类型转换

一、C语言中的类型转换一、C语言中的类型转换在 C 语言中,如果,或者,或者时,就需要发生类型转化。隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转化:需要用户自己处理。:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。二、为什么C++需要四种类型转换有些情况下可能会出问题:比如数据精度丢失。代码不够清晰。因此 C++ 提出了自己的类型转化风格,注意因为。三、C++强制类型转换。

Elena's Blog 1943

【小梦C嘎嘎——启航篇】C++四大类型转换

分享有关C++四大类型转换的相关知识点以及场景举例~

小梦的博客 1578

【C++基础】Day 9:四大强转 static_cast vs dynamic_cast vs reinterpret_cast vs const_cast

本文系统梳理了 C++ 中最核心的四类强制类型转换:static_cast、dynamic_cast、reinterpret_cast、const_cast。它们是现代 C++ 替代传统 C 风格强转的安全机制,但由于语义差异大、适用场景不同,是 C++ 面试八股中最容易混淆的高频考点。文章从 编译期 vs 运行期 入手,解释了为什么 static_cast 与 dynamic_cast 的行为差异本质来自编译器能否看到真实类型;随后结合 RTTI 与虚函数表机制,深入讲解 dynamic_cast

冰冻三尺非一日之寒 833
上一篇: C++11新增特性:智能指针(RAII)
下一篇: Mysql:数据库和表增删查改基本语句
小白debug~
小白debug~ 新星创作者: C/C++技术领域 新星创作者: C/C++技术领域
博客等级 码龄4年 3510粉丝 128原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白debug~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值