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进行)。... 阅读详情

相关推荐

STM32与K210串口通信

这篇文章是为了填上一篇埋下的坑,k210和STM32通过串口通信,我是采用数据包的形式发送数据的,因为K210发送的数据有几种,采用数据包的形式发送比较安全。本文代码运行的平台是STM32F103C8T6和K210 Dock,只涉及到K210发送数据给STM32,stm32将接受到的数据显示到0.96寸OLED屏上。

qq_70715693的博客 3万+

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

网络变压器等效电路及网络变压器中间抽头作用详解

       华强盛电子导读:要详细了解网络变压器周边EMC管控及网络变压器BOB-SMITH电路的连接原理,首先我们对网络变压器的认识及其电路各参数影响都要有个简要的认识,本文,对非理想网络变压器等效电路做一个详细的分析,其中重点讨论一下网络变压器中间抽头的作用其影响                          网络变压器等效电路及                        ...

网络变压器专业资料 6005

【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万+

Android perfetto 简介

android linux 性能优化 原理及操作

求变,从思想开始 3479

【翼型】基于Matlab的NACA翼型气动性能仿真与优化【附源码】

本文详细介绍了如何使用Matlab进行NACA翼型的气动性能仿真与优化。内容涵盖从生成NACA翼型坐标、利用面板法快速估算升阻力,到进阶的粘性流模拟与优化设计入门。通过清晰的代码示例和分步指南,帮助读者掌握基于Matlab的翼型分析与优化流程,为飞行器或叶片设计提供实用工具和方法。

weixin_29032489的博客 411

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

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

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

若依前后端分离版集成nacos

服务动态配置与服务注册发现根据公司要求,需要将项目集成到nacos中,当前项目是基于若依前后端分离版开发的,若依的版本为3.8.3,若依框架中整合的springBoot版本为2.5.14。Nacos核心提供两个功能:服务注册与发现,动态配置管理。

NDF923的专栏 4645

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

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

m0_74206992的博客 451

全网最详细的UAVCAN/DroneCAN链路开发(官方DroneCAN消息+自定义DroneCAN消息)附DroneCAN项目源码

全网最详细的UAVCAN/DroneCAN链路移植开发(官方DroneCAN消息+自定义DroneCAN消息)附工程移植源码

Bit_Dong的博客 3238

MIMIC数据库简介

一 、MIMIC简介 MIMIC(Medical Information Mart for Intensive Care),是一个大型的公开数据库。该数据库记录了2001年至2019年期间贝斯以色列女狄肯斯医疗中心重症监护病房患者的相关数据,拥有4万多名患者的医疗健康数据和记录。 MIMIC数据库记录了人口统计学信息,如病人的性别、身高、宗教等情况。记录了实验室检验信息,如血常规,肝功能,肾功能等实验室检测数据。记录了患者的用药信息,如高血压患者服用了治疗高血压类药物等。记录了护理人员以及患者的护理级别等。

越努力 越幸运 1万+

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

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

Zero_VPN的博客 3034

如何在 Ubuntu 22.04 上安装和配置 VNC 服务器?

VNC(Virtual Network Computing)是一种图形桌面共享系统,通过网络允许用户控制另一台计算机的桌面环境。无论你是系统管理员还是开发人员,VNC 都可以在远程访问桌面环境时提供极大的便利。在安装和配置 VNC 服务器之前,我们需要确保系统是最新的,并安装一些基本工具。这些命令将更新你的软件包列表并升级所有已安装的软件包,以确保你拥有最新的安全修复和功能更新。

网络技术联盟站 4003

C++类型转换和RTTI

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

2301_82023822的博客 987

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

C++类型转换

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

qq_74276498的博客 1209

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

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

【C++】类型转换

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

m0_70088010的博客 1107

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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、付费专栏及课程。

余额充值