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

相关推荐

Android ------ 开源的Modnet算法实现抠图和更换背景

Portrait Matting (sight-x.cn) 飞桨PaddlePaddle-源于产业实践的开源深度学习平台 GitHub - PaddlePaddle/PaddleSeg at develop

切切歆语的博客 1万+

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

手把手教你用FPGA实现SerDes高速接口设计(附避坑指南)

本文是一份详尽的FPGA SerDes高速接口设计实战指南。文章深入剖析了SerDes硬核(如GTX/GTH)的时钟管理、发送端均衡、接收端CDR与均衡等核心模块,并提供了Verilog代码示例。重点分享了信号完整性分析、眼图调试与误码率测试等实战经验,附有自定义高速视频流接口的完整实现案例与避坑指南,帮助工程师从“会用”到“懂”且能独立驾驭高速接口设计。

ik678901234的博客 1146

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

100道测试工程师笔试的Linux笔试题及答案_网络安全工程师关于linux的笔试大题

47.Linux系统中,一般把命令 ls 定义为 ls --color 的别名,以便以不同颜色来标识不同类型的文件。但是,如何能够使用原先的ls命令?83.在xdm的配置目录中,哪个文件用来设置在用户通过xdm登录后自动起动的应用程序?45.你的系统使用增量备份策略,当需要恢复系统时,你需要按什么顺序恢复备份数据?84.命令 netstat -a 停了很长时间没有响应,这可能是哪里的问题?51.Linux中,提供TCP/IP包过滤功能的软件叫什么?88.TCP/IP中,哪个协议是用来进行IP自动分配的?

2401_84247760的博客 1054

3GPP协议解读_物理层系列(一)_物理层协议怎么看?

5G NR相关协议一般都在38系列,点进去以后可以看到,38.2xx系列为物理层相关协议,为了掌握物理层相关知识,应该怎么看协议呢?我建议从38.201读起,对38.2xx系列协议有一个整体的把握。

JCMLSY的博客 1329

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

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

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

iOS 取证窍门:为什么要先从 Recovery 恢复模式开始?

未记录的 DFU 代表“设备固件升级”。与专为普通用户设计的恢复模式不同,DFU 模式从来都不是为公众设计的。Apple 知识库中的任何地方都没有关于 DFU 的文档。进入 DFU 的方法主要是通过按下、按住和释放按钮的复杂操作序列,并具有精确的时间限制。在多个步骤中的任何一个步骤中,如果时间错误,都会导致重新启动设备,而不是将其切换到 DFU。另外,设备屏幕上也没有 DFU 模式的指示。如果设备成功切换到 DFU,显示屏将保持黑色。即使对于专家来说,进入 DFU 模式也可能很困难。恢复模式是最容易解释的。

2302_82041293的博客 1198

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

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

m0_74206992的博客 451

文献解读:结构方程模型SEM基础,小白看这个就基本够了

今天要解读的依然是一篇教学文献:The Basics of Structural Equation Modeling,文献作者是Diana Suhr, Ph.D. University of Northern Colorado。 文献链接: https://www.lexjansen.com/wuss/2006/tutorials/TUT-Suhr.pdf 结构方程模型是: 用来检验显变量与潜变量关系假设的综合性的统计技巧 用来表示,估计或者检验变量间理论关系的技巧 用来探究一系列潜变量和显变量因

Codewar的博客 6万+

使用Python爬虫抓取旅游景点评价数据并进行热度可视化

景点热度通常由景点的评分、评论数以及游客的热情度来决定。高热度的景点通常意味着更高的游客评分和更多的游客评论。热度不仅反映了景点的受欢迎程度,还可以揭示某些景点的潜力和存在的问题。评分:游客对景点的综合评分,通常是0到5分。评论数:景点的评论数量,反映了游客对景点的关注程度。热度变化:在一定时间内,景点的评价和评论数量变化,能够反映景点的热度波动。通过使用Python爬虫技术抓取旅游景点的评价和评论数据,我们能够深入分析景点的热度,并通过数据可视化工具将这些信息展示给用户。

2201_76125261的博客 1282

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

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

Zero_VPN的博客 3034

从0开始图形学(光栅化)

从0开始图形学

A112459的专栏 2395

C++类型转换和RTTI

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

2301_82023822的博客 987

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

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

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

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

C++类型转换

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

qq_74276498的博客 1209

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【C++】类型转换

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

m0_70088010的博客 1107

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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

余额充值