【C++】static_cast和dynamic_cast使用详解

news2024/11/18 21:32:56

目录

  • 一、static_cast
  • 二、dynamic_cast
  • 三、总结
    • 如果这篇文章对你有所帮助,渴望获得你的一个点赞!

一、static_cast

static_cast 是 C++ 中的一种类型转换操作符,用于执行编译时的类型转换。它主要用于在不损失 const 限定的前提下进行各种合法的类型转换,包括数字类型之间的转换、指针类型的转换,以及一些与继承关系相关的转换。static_cast 在编译时执行类型检查,因此它提供了一些类型安全性。

  1. 基本类型之间的转换:

    int i = 42;
    double d = static_cast<double>(i);  // 从整数到浮点数的转换
    
  2. 指针类型的转换:

    Base* basePtr = new Derived();
    Derived* derivedPtr = static_cast<Derived*>(basePtr);
    

    注意:static_cast 对于指针类型的转换,要求两者之间有合理的转换关系,否则可能会导致不确定的行为。

  3. 引用类型的转换:

    int x = 10;
    const int& y = static_cast<const int&>(x);
    

    类似于指针类型,引用类型的转换也要求两者之间有合理的转换关系。

  4. 类层次结构中的转换:

    class Base { /* ... */ };
    class Derived : public Base { /* ... */ };
    
    Base* basePtr = new Derived();
    Derived* derivedPtr = static_cast<Derived*>(basePtr);
    

    这里使用 static_cast 进行基类指针到派生类指针的转换。但请注意,如果类之间没有继承关系,或者在继承关系中并非公共基类,这样的转换可能是不安全的。

总之,static_cast 在进行一些明确的、静态可知的类型转换时非常有用。但在涉及到动态类型、多态和运行时类型检查的情况下,可能需要使用 dynamic_cast 或其他更为安全的转换方式。


二、dynamic_cast

dynamic_cast 是 C++ 中的一种动态类型转换运算符,用于在运行时执行类型检查,主要用于处理类的多态性。它通常与继承、虚函数和多态一起使用。

使用 dynamic_cast 时,被转换的类型必须包含虚函数,否则编译器可能会报错。这是因为 dynamic_cast 的实现依赖于虚表(vtable)信息,而虚表是通过虚函数来构建的。

语法如下:

dynamic_cast<new_type>(expression)

其中,new_type 是你希望将表达式 expression 转换成的新类型。dynamic_cast 会在运行时检查 expression 的实际类型是否与 new_type 兼容。如果兼容,转换成功;否则,返回 nullptr(对于指针类型)或 std::bad_cast 异常(对于引用类型)。

以下是 dynamic_cast 的几种用法:

  1. 指针类型的转换:

    class Base { virtual void foo() {} };
    class Derived : public Base {};
    
    Base* basePtr = new Derived();
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    
    if (derivedPtr) 
    {
        // 转换成功
    } 
    else 
    {
        // 转换失败
    }
    

    这里,dynamic_castBase 类型的指针 basePtr 转换为 Derived 类型的指针 derivedPtr。如果实际对象是 Derived 类型或其派生类型,转换就会成功。

  2. 引用类型的转换:

    Base& baseRef = *basePtr;
    try 
    {
        Derived& derivedRef = dynamic_cast<Derived&>(baseRef);
        // 转换成功
    } 
    catch (const std::bad_cast& e) 
    {
        // 转换失败
    }
    

    引用类型的转换可以使用 try-catch 块捕获 std::bad_cast 异常,因为在转换失败时,dynamic_cast 会抛出此异常。

  3. 多层次的类结构:

    class Base { virtual void foo() {} };
    class Intermediate : public Base {};
    class Derived : public Intermediate {};
    
    Base* basePtr = new Derived();
    Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
    
    if (derivedPtr) 
    {
        // 转换成功
    } 
    else 
    {
     // 转换失败
    }
    

    dynamic_cast 可以处理多层次的类结构,逐层检查类型的兼容性。

总之,dynamic_cast 只能用于处理具有虚函数的类。对于非多态类型的转换,应使用 static_cast。此外,dynamic_cast 的运行时开销相对较大,因此在性能敏感的场景中应谨慎使用。

三、总结

static_cast 并不执行运行时类型检查。因此,如果你尝试执行一种不安全的转换,例如将基类指针转换为不相关的派生类指针,编译器可能不会发出警告或错误,但在运行时可能会导致未定义的行为。在这种情况下,你可能需要考虑使用 dynamic_cast,它执行运行时类型检查,但仅在涉及多态的情况下才适用。


如果这篇文章对你有所帮助,渴望获得你的一个点赞!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386066.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【WSL】Win10 使用 WSL2 进行 Linux GPU 开发

1. GPU 驱动 先安装 驱动 参考 https://docs.nvidia.com/cuda/wsl-user-guide/index.html 使用 https://www.nvidia.com/Download/index.aspx 提供的兼容 GeForce 或 NVIDIA RTX/Quadro 显卡在系统上安装 NVIDIA GeForce Game Ready 或 NVIDIA RTX Quadro Windows 11 显示驱动…

Eclipse的安装与使用

Eclipse的安装与使用 “工欲善其事&#xff0c;必先利其器”&#xff0c;高效的开发工具&#xff0c;不但能带来高体验的开发环境&#xff0c;还能带来高效的纠错与开发提示等功能&#xff0c;下面介绍一种Java常用的开发工具——Eclipse。 1.1 Eclipse的安装与启动 Eclipse的…

MK-米客方德TF卡和SD卡的区别

TF卡和SD卡的区别 TF卡也叫MicroSD卡&#xff0c;以MK-米客方德的TF卡和SD卡为例&#xff0c;TF卡和SD卡的区别如下&#xff1a; 1、物理尺寸&#xff1a; TF卡&#xff1a;TF卡是一种较小尺寸的存储卡&#xff0c;也被称为MicroSD卡。其尺寸为15mm 11mm 1mm。 SD卡&#x…

k8s--动态pvc和pv

目录 前情回顾 动态pv 实验模拟 步骤一&#xff1a;在stor01节点上安装nfs&#xff0c;并配置nfs服务 接下来在matser01上配置 步骤二&#xff1a;创建 Service Account&#xff0c;用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则 步骤三&#xff1a;使用 Deploy…

python实现网络爬虫代码_python如何实现网络爬虫

python实现网络爬虫的方法&#xff1a;1、使用request库中的get方法&#xff0c;请求url的网页内容&#xff1b;2、【find()】和【find_all()】方法可以遍历这个html文件&#xff0c;提取指定信息。 python实现网络爬虫的方法&#xff1a; 第一步&#xff1a;爬取 使用reque…

基于ssm的疫苗预约系统论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装疫苗预约系统软件来发挥其高效地信息处理的作用&#xff0c…

SpringCloud.03.网关Gateway

目录 网关Gateway的概念&#xff1a; 准备 使用 方式一 因为配置了网关所以可以直接通过gateway发送请求 方式二 修改配置前&#xff1a;http://localhost:8082/provider/run 方式三(动态路由) 导入配置类 网关Gateway的概念&#xff1a; Spring Cloud Gateway 是 Spri…

如何统一给文件夹名加后缀?这个方法教你一键搞定

随着计算机的普及&#xff0c;我们每天都会处理大量的文件和文件夹。有时候&#xff0c;为了更好地管理和分类文件&#xff0c;我们会给文件夹统一加上后缀。给文件加上后缀后最直接的好处就是方便文件管理。当我们给文件夹加上后缀时&#xff0c;我们可以很容易地根据后缀来判…

如何创作出优秀的电子邮件营销(EDM)?

EDM出现的时间很早&#xff0c;是非常传统的一种推广方式。即便是其他推广方式的蓬勃兴起&#xff0c;EDM依旧深受很多行业的喜爱。主要源于它极高的性价比&#xff0c;据可靠数据&#xff0c;EDM的投资回报比达1&#xff1a;48。 那一封优秀的EDM应该是怎么样的呢&#xff1f;…

校园失物招领系统的设计与实现-Flask+Mysql+LayUI

1.设计要求&#xff1a; 2.python项目结构&#xff1a; 3.开发工具&#xff1a;PyCharmNavicat for MySQL 数据库表设计&#xff1a; 4.运行效果截图&#xff1a; (1) 管理员登录页 &#xff08;2&#xff09;管理员界面&#xff1a; &#xff08;3&#xff09;物品登记页面&…

进阶Docker3:Dokerfile构建镜像

目录 Dockerfile 构建基础镜像 基本机构 命令&#xff1a; 命令解释&#xff1a; 准备工作 创建镜像 上传镜像 Dockerfile Dockerfile 是一个文本格式的配置文件&#xff0c; 用户可以使用 Dockerfile 来快速创建自定义的镜像&#xff0c;另外&#xff0c;使 用Docke…

升降式OLED透明屏,影响价格的因素有这6大方面

以下是一篇关于升降OLED透明屏的文章&#xff0c;包括其规格、实现原理、应用领域、特色优势和价格等方面&#xff1a; 升降OLED透明屏的规格升降OLED透明屏的尺寸可以根据不同的需求进行定制&#xff0c;尺寸范围从32英寸到200英寸不等。同时&#xff0c;它的厚度不到1厘米&am…

小程序中使用微信同声传译插件实现语音识别、语音合成、文本翻译功能----语音合成(二)

官方文档链接&#xff1a;https://mp.weixin.qq.com/wxopen/plugindevdoc?appidwx069ba97219f66d99&token370941954&langzh_CN#- 要使用插件需要先在小程序管理后台的设置->第三方设置->插件管理中添加插件&#xff0c;目前该插件仅认证后的小程序。 语音合成…

【软件测试】28岁测试工程师对未来很迷茫?测试之路何去何从?

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 程序员到了30岁是…

瑞吉外卖笔记系列(1) —— 环境配置,后台登录和退出的功能实现

本文档主要介绍软件开发整体流程和瑞吉外卖项目&#xff0c;开发环境搭建步骤&#xff0c;以及简单的后台系统功能实现 文章目录 一、软件开发整体介绍1.1软件开发流程1.2 角色分工1.3 软件环境 二、瑞吉外卖项目介绍2.1 项目介绍2.2 产品原型展示2.3 技术选型2.4 功能架构2.5 …

Linux Kernel 4.14--EOF

2017 年&#xff0c;Linux 内核长期支持版本&#xff08;LTS&#xff09;的支持时间从原来的2年增加到6年。2023年下半年举行的开源欧洲峰会&#xff0c;LTS 的支持时间取消来了6年&#xff0c;再次缩短到了 2 年。 首个获得6年支持的版就是是 4.14。 在六年支持之后&#xf…

方案解决:5G基站节能及数字化管理

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…

推荐一款实用的免费开源局域网传输工具!轻松搭建网盘的神器!

本文小编给大家分享一款免费开源软件 Filebrowser&#xff0c;使用它可以轻松搭建属于你的个人网盘和网页版文件管理器。 它能做什么呢&#xff1f;想必大家也都用过百度网盘或阿里云盘之类的云存储服务&#xff0c;将自己的所有数据都存储在别人的服务器上&#xff0c;所谓的在…

国图公考:2024山东省事业单位发布招聘公告

更多信息可以登录山东人事考试信息查看&#xff01;

加速度计:M-A552AC1 / AR1

M-A552传感器单元测量3轴加速度&#xff0c;精度高&#xff0c;稳定性好&#xff0c;体积小&#xff0c;功耗低。该传感器单元采用最新技术来提高性能并提供更宽的传感带宽。具有控制器局域网(CAN)接口或RS422接口&#xff0c;支持主机通信 般描述 M-A552是一个三轴数字输出加…