C++中四种cast转换

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


C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast

1.const_cast

用于将const变量转为非const

2.static_cast

用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知;
在这里插入图片描述

注:从图中可以看出来,派生类不仅有自己的方法和属性,同时它还包括从父类继承来的方法和属性。当我们从派生类向基类转化时,不管用传统的C语言还是C++转换方式都可以百分百转换成功,但是可怕的是向下转换,也就是由基类向派生类转换,当我们采用传统的C语言和C++转换时,就会出现意想不到的情况,因为转换后派生类自己的方法和属性丢失了,一旦我们去调用派生类的方法和属性那就糟糕了,这就是对类继承关系和内存分配理解不清晰导致的,好在C++增加了static_cast和dynamic_cast运用于继承关系类间的强制转换。

使用方法:

static_cast< new_type >(expression)

备注:new_type为目标数据类型,expression为原始数据类型变量或者表达式。

static_cast详解

static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

  1. 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。
  2. 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
  3. 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  4. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。
  5. 把空指针转换成目标类型的空指针。
  6. 把任何类型的表达式转换成void类型。

基本类型数据转换举例如下:

char a = 'a';
int b = static_cast<char>(a);//正确,将char型数据转换成int型数据

double *c = new double;
void *d = static_cast<void*>(c);//正确,将double指针转换成void指针

int e = 10;
const int f = static_cast<const int>(e);//正确,将int型数据转换成const int型数据

const int g = 20;
int *h = static_cast<int*>(&g);//编译错误,static_cast不能转换掉g的const属性

类上行和下行转换:

class Base
{};

class Derived : public Base
{}

Base* pB = new Base();
if(Derived* pD = static_cast<Derived*>(pB))
{}//下行转换是不安全的(坚决抵制这种方法)

Derived* pD = new Derived();
if(Base* pB = static_cast<Base*>(pD))
{}//上行转换是安全的

3.dynamic_cast

用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回NULL,对于引用抛异常。要深入了解内部转换的原理。

向上转换:指的是子类向基类的转换

向下转换:指的是基类向子类的转换

它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。

转换方式:

dynamic_cast< type >(e)*
 type必须是一个类类型且必须是一个有效的指针
dynamic_cast< type& >(e)
type必须是一个类类型且必须是一个左值
dynamic_cast< type&& >(e)
type必须是一个类类型且必须是一个右值

e的类型必须符合以下三个条件中的任何一个:
1、e的类型是目标类型type的公有派生类
2、e的类型是目标type的共有基类
3、e的类型就是目标type的类型。

如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0。如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准库头文件中)。e也可以是一个空指针,结果是所需类型的空指针。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast)。

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

指针类型

举例,Base为包含至少一个虚函数的基类,Derived是Base的共有派生类,如果有一个指向Base的指针bp,我们可以在运行时将它转换成指向Derived的指针,代码如下:

if(Derived *dp = dynamic_cast<Derived *>(bp)){
  //使用dp指向的Derived对象  
}
else{
  //使用bp指向的Base对象  
}

值得注意的是,在上述代码中,if语句中定义了dp,这样做的好处是可以在一个操作中同时完成类型转换和条件检查两项任务。

引用类型

因为不存在所谓空引用,所以引用类型的dynamic_cast转换与指针类型不同,在引用转换失败时,会抛出std::bad_cast异常,该异常定义在头文件typeinfo中。

void f(const Base &b){
 try{
   const Derived &d = dynamic_cast<const Base &>(b);  
   //使用b引用的Derived对象
 }
 catch(std::bad_cast){
   //处理类型转换失败的情况
 }
}

4.reinterpret_cast

几乎什么都可以转,比如将int转指针,可能会出问题,尽量少用;

5.为什么不使用C的强制转换?

C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。

参考链接

1.说一说c++中四种cast转换
2.static_cast和dynamic_cast详解

说一说c++中四种cast转换 类型转换是项目中常使用的一种语法规则,几乎每个编程语言都不可避免的涉及到这方面,懂得动态的类型转换能够快速的解决一些棘手的难题,并且迸发出出人意料的效果。当然在面试当中也是作为一个频率略高的话题。 尤其在C++当中,面向对象最大的特点是多态性,而要很好的使用这个特性,避免不了指针和引用,避免不了类型转换的问题。 为什么不使用C的强制转换? C的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。 C 风格(C-style)强制转型如下: (T) exp 阅读详情

相关推荐

【TestNG自动化测试框架详解】

TestNG是一款设计测试用例执行流程的测试框架。

weixin_43936332的博客 1540

C++中的cast类型转换

C++中的几种cast强制类型转换

scott198512的博客 1470

同花顺自动化交易避坑指南:pywinauto实战中验证码识别与界面弹窗处理

本文深入探讨同花顺自动化交易中的关键稳定性问题,重点解决验证码识别与弹窗处理两大难题。通过优化Tesseract OCR、整合打码平台API以及设计pywinauto弹窗监控体系,提供了一套完整的自动化交易解决方案,帮助交易者有效规避资金账户和持仓信息操作中的常见陷阱。

weixin_33734785的博客 488

c++中四种cast转化

c++中四种cast转化 1.const_cast转化 const变量????非const变量 •常量指针转化为非常量的指针,并且仍然指向原来的对象 •常量引用转化为非常量的引用,并且仍然指向原来的对象 (★const_cast只能改变运算对象的底层const,而对顶层const无能为力 ★const_cast不能改变表达式类型,只能改变常量属性) 1.去掉const常量const属性 const i...

哈哈哈哈哈哈哈哈的博客 996

QT实现HTTP文件(夹)下载的完整流程与实战技巧

本文详细介绍了使用QT框架实现HTTP文件和文件夹下载的完整流程与实战技巧。通过QNetworkAccessManager等核心类,讲解了从单文件下载、大文件处理、进度显示、暂停/取消功能,到复杂的文件夹下载策略。文章重点剖析了断点续传、错误处理与网络健壮性等关键问题,为C++桌面应用集成稳定高效的下载功能提供了专业指导。

weixin_29239279的博客 279

Zemax序列模式下激光二极管(LD)光源建模与像散校正实战

本文详细讲解了在Zemax序列模式下精确建立激光二极管(LD)光源模型并校正其像散的核心方法。通过将椭圆光束的发散角转换为渐晕系数,并巧妙利用理想柱面镜模拟像散,实现了对LD光源特性的高精度模拟。该方法特别适用于激光耦合、激光雷达等需要对像散光束进行精密控制的光学系统设计。

weixin_28455801的博客 440

你真懂吗?C++ 四种 cast 转换

C++ 是一种强类型的语言。C++有四个特定的转换运算符:dynamic_cast、reinterpret_cast、static_cast 和 const_cast。

Chauncyxu的博客 1814

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程BACnet MS/TP BACnet IP调试说明

bacnet 官方协议栈 bacnet-stack-0.8.2关于router例程mstp,bacnet ip调试说明

shufawangzhang的博客 2222

聊聊智能指针 auto_ptr、shared_ptr、weak_ptr和unique_ptr

本文为转载:https://www.cnblogs.com/zeppelin5/p/10083597.html,对作者有些地方做了修正。 手写代码是理解C++的最好办法,以几个例子说明C++四个智能指针的用法,转载请注明出处。 一、auto_ptr   auto_ptr这是C++98标准下的智能指针,现在常常已经被C++标准的其他智能指针取代。它的缺点是在转移所有权后会使运行期不安全。C++...

weixin_30391339的博客 418

6D位姿估计系列(一)

本研究提出FoundationPose,一个统一的基础模型框架,支持基于CAD模型和无模型的6D物体姿态估计与跟踪。通过神经隐式表示实现高效新视图合成,结合大规模合成数据训练和对比学习策略,模型展现出强大的泛化能力。实验表明,该方法在LINEMOD、YCB-Video等多个基准数据集上显著优于现有专门化方法,处理速度达32Hz,且无需目标域微调。该工作为多场景物体姿态估计提供了通用解决方案。

qq625924821的博客 562

EtherCAT总线运动控制学习笔记(RXXW_Dor)

说到总线控制,就要说到报文、对象字典、PN通信我们大部分会说报文,EtherCAT通信我们常说对象字典,叫法不一样,但是原理基本一致,下面我们简单认识下上面是对象字典。

RXXW_Dor的博客 5430

c++中的四种cast转换

C++继承并扩展C语言的传统类型转换方式,提供了功能更加强大的转型机制(检查与风险)C++11之后,C++中就有四种类型转换,分别是,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。如这个表达式将expression转换为一个type-id类型的对象。Type-id必须是一个指针、指向一个已经定义类的类型或一个指向 VOID 的指针。Expression的类型必须是一个指针,如果type-id是一个指针;当type-id是一个引用的时候必须是一个左值。

菜一头包的博客 1467

vue3+element-plus - 最新详细实现将表格Table组件 “所见所得导出“ 为excel(xls/xlsx)电子表格文件,表格中的图片图像、图标等媒体资源完美导出显示(详细示例代码)

vue3,nuxt3,element plus,表格组件,Table,el-table,导出,下载,excel,电子工作簿,xls,xlsx,将表格导出成xls,如何把表格原封不动的导出成excel,保留图片,带图片,图标,如何导出包括含有图片的Excel表格,图片和表格数据导出excel,把表格导出成excel格式,表格内的图片一起导出,vue3导出图片和数据到Excel,可导出图片,导出图像到Excel,网页上的图片怎么能导出到xls表格中,显示图片url链接,图片太多导出失败,图片会超出单元格,图片不

✅ 精选推荐文章 4767

c++中的四种cast转换, dynamic_cast、static_cast、const_cast、reinterpret_cast

C++11之后,C++中就有四种类型转换,分别是 dynamic_cast、static_cast、const_cast、reinterpret_cast,一般用这四种强制转换可以替代在c代码中类似(int)这种方式的转换。

qq_41841073的博客 7858

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【C++】一文掌握C++的四种类型转换 --- static_cast、reinterpret_cast、const_cast、dynamic_cast

本文讲解了C++的四种类型转换 : static_cast、reinterpret_cast、const_cast、dynamic_cast。并补充了对应的背景知识。并给出对应的使用建议

叫我龙翔的博客 2893

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

c++中四种cast转换

C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast 1、const_cast 用于将const变量转为非const 2、static_cast 用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知; 3、dynamic_...

qq_41007781的博客 704

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++的四种cast转换

C++的四种cast转换:static_cast、dynamic_cast、const_cast、reinterpret_cast 文章转载:https://www.cnblogs.com/chenyangchun/p/6795923.html 注: 上行(向上)转换:指的是子类向基类的转换 下行(向下)转换:指的是基类向子类的转换 const_cast 用于将const变量转为非const const_cast,用于修改类型的const或volatile属性。 该运算符用来修改类型的const(唯一有

SunSachin的博客 402

C++中的四种cast转换

列举C++中的四种cast的转换分别是什么,有何作用,并举例说明,我虽然早知道C++有四种cast转换,但平常使用非常少也就没注意,打算对C++的这些类型转换方法进行小结。下文中的“常规类型”指的是int、double、float、bool……这些非结构化类型,也就是不包括struct和class类型。“旧式转换”指的是C语言风格的“(NewType)(Val)”方式的转换。1、指针=>常

janet_cheung的专栏 1156

【c++ 回顾】四种cast转换

说一说c++中四种cast转换 C++中四种类型转换是:static_cast, dynamic_cast, const_cast, reinterpret_cast static_cast: static_cast: 任何具有明确定义的类型转换都可以使用static_cast进行转换,但是他无法去掉const性质 const char *cp; char *q = static_...

Gin.TaMa的博客 484
上一篇: static关键字的作用
下一篇: Docker使用教程
ZHAOCHENHAO-
博客等级 码龄10年 2774粉丝 72原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值