当前位置: 首页 > news >正文

【C++】四种强制类型转换

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥c++系列专栏:C/C++零基础到精通 🔥

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述

c语言内容💖:

专栏:c语言之路重点知识整合

【c语言】全部知识点总结


目录

  • C++四种类型转换
    • static_cast静态转换
    • dynamic_cast动态转换
    • const_cast去常转换
    • reinterpret_cast重解释类型转换

C++四种类型转换

  • static_cast<类型>(待转换量)
  • dynamic_cast<类型>(待转换量 )
  • const_cast<类型>(待转换量 )
  • reinterpret_cast<类型>( 待转换量 )

为什么要提出新的类型转换?

C语言中的强制类型转换无所不能,而C++强调类型安全。

发生隐式类型转换精度丢失时可能无法察觉到


static_cast静态转换

编译时确定的,用于相关内容的转换 ,基本的数据类型之间转换,指针之间类型的转换

  • int short char 之间
  • 浮点数与整数
  • 普通指针和泛型指针

例如:

    int a = 10;int b = 3;cout << static_cast<float>(a) / static_cast<float>(b) << endl;int *ptr = &a;void *ptr2 = static_cast<void*>(ptr);

可进行继承中对象的向上转换

(向下转换(父类指针转为子类)没有类型检查,可能会有问题:例如当多个孩子继承父类)

注: A是B的父类,B->A 继承中对象的向上转换 A->B 向下转换

不相关的、不安全的不能转换

例如: student与int
char* 与int*
int ->int或 int->int

毫无关系的两个类不能进行转换


dynamic_cast动态转换

只适用于继承链上的两个类之间的转换,不能用于其他基本变量的转换

继承的向上转换效果等同于static_cast

继承向下转换会进行动态的安全检查

  • 如果转换失败,将会返回空指针异常

指针转换失败返回空指针,引用转换失败抛出异常

class Father 
{ virtual ~Father() {} 
};  
class Son : public Father 
{
};  Father* pFa = new Son;  
Son* pSon = dynamic_cast<Son*>(pFa);  

当向下转换(父类指针转为子类)时,父类中必须包含虚函数!(static_cast 不需要)

运行时检查转换是否有效

它会在运行时检查转换是否有效。当进行下行转换(将基类指针或引用转换为派生类指针或引用)时,它需要能够在运行时确定对象的实际类型。
没有虚函数时,编译器在编译阶段只是把 Base 类和 Derived 类当作独立的类型来处理

不能用于基本类型之间的转换,只能转换指针或引用


const_cast去常转换

用于改变类型的const或volatile属性。

它常用于修改指针或引用的const属性,以便修改原本定义为const的数据。

    const char *str = "TianXi";char *p = const_cast<char*>(str);

可以用于:

  • 对常量去常,移除const属性,但修改是不安全的
  • 对常对象去常,然后可以调用各种类成员函数
  • 将 volatile 转为非 volatile,防止修饰变量编译优化

reinterpret_cast重解释类型转换

C++中的强制类型转换,有安全隐患,一般编译不过再用。


它可以把任何类型的指针转换成任何其他类型的指针,或者把任何整数类型转换成任何指针类型,

或者把指针转换成整数类型。但是这种转换没有运行时类型检查来保证安全性。

无论是否相关,都可以进行转换重新解释


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

http://www.mrgr.cn/news/58055.html

相关文章:

  • 修改windows11的hosts,配置127.0.0.1域名(最清晰)
  • 智慧社区服务平台搭建方案
  • Leetcode4:寻找两个正数数组中的中位数
  • React Native 项目使用Expo模拟器运行iOS和Android
  • 十七、行为型(命令模式)
  • ctfshow-文件上传-151-161
  • mongodb在linux下的部署
  • 在 Flutter鸿蒙next版本 中使用 if 语句和三元表达式进行视图逻辑判断
  • Unity之如何在Linux上部署Dedicated Server专用服务器
  • 函数柯里化
  • 头歌——人工智能(搜索策略)
  • 【LeetCode】11.盛最多水的容器
  • 【福建医科大学附属第一医院-注册安全分析报告】
  • 优雅/灵活 地定制tkinter按钮样式
  • 在Windows 10操作系统中搭建FTP
  • Java 使用 aspose-cells 转 Excel 为 PDF 丢失表格线,列过多分页,单元格内容显示不全问题
  • 线上问题排查-频繁GC
  • 大数据治理:Python实现与案例分析
  • C/C++语言基础--C++模板与元编程系列一(泛型、模板、函数模板、全特化函数模板………)
  • C语言字符函数和字符串函数
  • 介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。(AI)
  • JavaSE——IO流7:其他流
  • 深入理解Flutter鸿蒙next版本 中的Widget继承:使用extends获取数据与父类约束
  • JWT加密解密
  • 【三方服务集成】最新版 | 阿里云短信服务SMS使用教程(包含支持单双参数模板的工具类,拿来即用!)
  • 深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构