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

ops/2024/10/25 3:21:26/

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
🔥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.ppmy.cn/ops/128225.html

相关文章

Vue中使用路由

目录 单页应用程序&#xff1a;SPA - Single Page Application路由 VueRouterVueRouter使用步骤组件存放目录问题 路由模块封装声明式导航 - 导航连接两个类名自定义匹配类名 声明式导航 - 跳转传参Vue路由 - 重定向Vue路由 - 404Vue路由 - 模式设置 编程式导航 - 基本跳转编程…

C++题集

1。对象的核心概念就是通常所说的 继承、封装和多态性 。 2。函数的 声明、定义和调用 称为函数三步曲. 3.Cin后面的符号是&#xff1a; 〉> ,cout后面的符号是&#xff1a; << 。 4.面向对象的英文缩写是&#xff1a; OOP 。 5。已知X2,y3&#xff0c;x<y的值…

STMicroelectronics 意法半导体芯片选型表

意法半导体作为全球知名的半导体厂商&#xff0c;其产品广泛应用于各个领域&#xff0c;从消费电子到工业控制&#xff0c;从汽车电子到通信设备&#xff0c;都能看到意法半导体芯片的身影。在电子硬件设计领域&#xff0c;芯片的选型至关重要。亿配芯城&#xff08;ICgoodFind…

uiautomatorviewer安卓9以上正常使用及问题处理

一、安卓9以上使用uiautomatorviewer问题现象 打开Unexpected error while obtaining UI hierarchy 问题详情 Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 二、问题处理 需要的是替换对应D:\software\android-sdk-windows…

StockEmotions :洞察投资者情绪,助力金融时序研究

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 这篇论文介绍了StockEmotions数据集&#xff0c;它包含从金融社交媒体平台StockTwits收集的10,000条英文评论&#xff0c;旨在通过识别投资者情绪来进行金融情绪分析和…

LockBit多版本简单对比

LockBit家族介绍 LockBit是一种非常知名且活跃的勒索软件家族&#xff0c;自2019年首次被发现以来&#xff0c;已经经历了多个版本的演变。它以其高效的加密速度和自动化攻击能力而闻名&#xff0c;对各类组织构成了严重威胁。 发展时间线如下&#xff1a; 时间 事件 2019年…

从0到1学习node.js(path模块以及HTTP协议)

文章目录 一、path模块二、HTTP协议1、常见状态码分类2、IP地址3、端口 一、path模块 // 引入path模块 const path require(path)// 拼接地址 const resolveData path.resolve(__dirname, ./index) console.log(__dirname, __dirname) console.log(resolveData, resolveData…

机器视觉相机自动对焦算法

第一&#xff0c;Brenner梯度法、 第二&#xff0c;Tenegrad梯度法、 第三&#xff0c;laplace梯度法、 第四&#xff0c;方差法、 第五&#xff0c;能量梯度法。 此实例通过使用Halcon实现5种清晰度算法函数&#xff1a; 1. 方差算法函数&#xff1b; 2. 拉普拉斯能量函数…