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

cpp 强制转换

一、static_cast 

static_cast 是 C++ 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生类到基类)等。

基本用法:

1、基本数据类型转换static_cast 可以用于执行明确的类型转换,例如将 int 转换为 float,或者将 double 转换为 int(但请注意,这种转换可能会导致数据丢失或精度下降)。

int a = 10;  
float b = static_cast<float>(a); // 将 int 转换为 float  
int c = static_cast<int>(3.14); // 将 double(默认为 double)转换为 int,结果为 3

2、对象指针或引用的向上转换:在类的继承体系中,static_cast 可以用于将派生类对象的指针或引用转换为基类对象的指针或引用。这种转换是安全的,因为派生类对象总是可以视为基类对象。

class Base {};  
class Derived : public Base {};  Derived* d = new Derived();  
Base* b = static_cast<Base*>(d); // 安全的向上转换

注意事项:

1、static_cast 在编译时进行类型检查,但进行运行时类型检查。如果转换不安全(例如,尝试将基类指针转换为派生类指针,且该基类指针实际上并不指向派生类对象),则结果将是未定义行为。

2、与 dynamic_cast 相比,static_cast 的性能通常更好,因为它不需要在运行时检查类型信息。但是,它要求程序员必须确保转换的安全性。

3、对于指针和引用的向下转换(即从基类到派生类),应使用 dynamic_cast 而不是 static_cast,因为 dynamic_cast 会在运行时检查转换的安全性。

二、dynamic_cast 

dynamic_cast 是 C++ 中的一个类型转换操作符,主要用于安全地将基类指针或引用转换为派生类指针或引用,以及将派生类指针或引用安全地转换为基类指针或引用(虽然这通常不需要 dynamic_cast,因为可以直接进行转换)。dynamic_cast 在执行转换时会检查对象是否确实为转换目标类型的实例,从而提供了一种类型安全的向下转换机制。

向下转换(基类到派生类)

当使用 dynamic_cast 进行基类到派生类的转换时,如果转换失败(即基类指针或引用并不指向一个派生类实例),则转换结果会是一个空指针(对于指针类型)或一个抛出了 std::bad_cast 异常的引用(对于引用类型,但注意:实际上,对于引用类型,如果转换失败,程序会立即终止,因为不能直接返回一个无效的引用)。因此,通常只将 dynamic_cast 用于指针的向下转换,并通过检查指针是否为空来判断转换是否成功。

向上转换(派生类到基类)

虽然 dynamic_cast 可以用于派生类到基类的转换,但这种转换通常是隐式的,并且总是安全的,因此不需要使用 dynamic_cast。然而,在某些情况下,如果你需要明确知道转换的类型信息(例如,在运行时类型识别 RTTI 的上下文中),你可能仍会选择使用 dynamic_cast 进行向上转换,但这并不是 dynamic_cast 的主要用途。

//demo
class Base {  
public:  virtual ~Base() {}  
};  class Derived : public Base {  
public:  void derivedFunction() {}  
};  int main() {  Base* basePtr = new Derived();  // 向下转换  Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);  if (derivedPtr != nullptr) {  derivedPtr->derivedFunction();  }  // 注意:通常不需要使用 dynamic_cast 进行向上转换  Base* basePtr2 = dynamic_cast<Base*>(derivedPtr); // 总是成功,但通常直接赋值即可  delete basePtr;  return 0;  
}

三、const_cast

const_cast 是 C++ 中的一个类型转换操作符,它用于修改类型的 const(或 volatile)限定符。这意味着你可以使用 const_cast 来移除对象的 const 属性,或者将非 const 对象转换为 const 对象(尽管后者通常是不必要的,因为你可以直接赋值给 const 类型的变量)。然而,const_cast 主要用于移除 const 限定符的场景,以便在特定情况下能够修改原本被声明为 const 的数据。

注意:修改通过 const_cast 移除 const 限定符的数据是危险的,因为它破坏了数据的 const 性质,可能会导致数据一致性问题或意外的副作用。

四、reinterpret_cast

reinterpret_cast 是 C++ 中的一个类型转换操作符,它允许进行非常低级的类型转换,几乎可以在任何指针类型之间、任何足够大的整数类型与指针类型之间、以及任何指针类型与足够大的整数类型之间进行转换。然而,这种转换几乎不检查类型的兼容性,也不保证转换后的值是安全的或有效的。

使用场景:

1、指针类型之间的转换:可以在不相关的指针类型之间进行转换,比如将 char* 转换为 int* 或将用户定义的类类型的指针转换为另一个类型的指针。但是,这种转换后的指针不能直接解引用,除非你确定转换是安全的。

2、指针与足够大的整数类型之间的转换:可以将指针转换为足够大的整数类型(如 uintptr_t),反之亦然。这通常用于底层编程,如内存管理或系统编程。

3、函数指针之间的转换:在函数指针之间进行转换,但这通常是不安全的,因为不同的函数可能有不同的调用约定或参数类型。

注意事项:

1、reinterpret_cast 几乎不检查类型兼容性,因此使用它时要格外小心。

2、转换后的值可能不是有效的或安全的,除非你确定转换是安全的。

3、使用 reinterpret_cast 可能会破坏类型安全,因为它允许将一种类型的指针视为另一种类型的指针。

4、在进行指针和整数之间的转换时,应确保整数类型足够大,以容纳指针值。

int a = 42;  
int* ptrToInt = &a;  // 将 int* 转换为 char*  
char* ptrToChar = reinterpret_cast<char*>(ptrToInt);  // 注意:现在 ptrToChar 指向的是与 ptrToInt 相同的内存地址,  
// 但是通过 ptrToChar 访问内存时,每个元素被视为 char 类型。  // 整数与指针之间的转换(假设 uintptr_t 足够大以存储指针)  
uintptr_t ptrValue = reinterpret_cast<uintptr_t>(ptrToInt);  
int* ptrFromInteger = reinterpret_cast<int*>(ptrValue);  // 注意:ptrFromInteger 现在应该与 ptrToInt 指向相同的地址。  
// 但是,如果 uintptr_t 不足以存储指针值,则这种转换可能会导致未定义行为。  // 函数指针之间的转换(通常不推荐)  
void (*funcPtr)() = nullptr;  
// 假设有一个合适的函数指针类型 FuncType  
// FuncType* funcPtrCast = reinterpret_cast<FuncType*>(funcPtr); // 危险!

创作不易,打赏一下呗。。

           

相关文章:

cpp 强制转换

一、static_cast static_cast 是 C 中的一个类型转换操作符&#xff0c;用于在类的层次结构中进行安全的向上转换&#xff08;从派生类到基类&#xff09;或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换&#xff08;即从派生…...

MySQL字符串魔法:拼接、截取、替换与定位的艺术

在数据的世界里&#xff0c;MySQL作为一把强大的数据处理利剑&#xff0c;其字符串处理功能犹如魔术师手中的魔法棒&#xff0c;让数据变换自如。今天&#xff0c;我们就来一场关于MySQL字符串拼接、截取、替换以及查找位置的奇幻之旅&#xff0c;揭开这些操作的神秘面纱。 介绍…...

在 Windows 上开发.NET MAUI 应用_1.安装开发环境

开发跨平台的本机 .NET Multi-platform App UI (.NET MAUI) 应用需要 Visual Studio 2022 17.8 或更高版本&#xff0c;或者具有 .NET MAUI 扩展的最新 Visual Studio Code。要开始在 Windows 上开发本机跨平台 .NET MAUI 应用&#xff0c;请按照安装步骤安装 Visual Studio 20…...

深度学习驱动智能超材料设计与应用

在深度学习与超材料融合的背景下&#xff0c;不仅提高了设计的效率和质量&#xff0c;还为实现定制化和精准化的治疗提供了可能&#xff0c;展现了在材料科学领域的巨大潜力。深度学习可以帮助实现超材料结构参数的优化、电磁响应的预测、拓扑结构的自动设计、相位的预测及结构…...

Netty UDP

Netty在UDP&#xff08;用户数据报协议&#xff0c;User Datagram Protocol&#xff09;通信中的应用非常广泛&#xff0c;特别是在对实时性要求较高、对数据准确性要求相对较低的场景中&#xff0c;如视频传输、语音通信等。以下是对Netty在UDP通信中的详细解析&#xff1a; …...

Spring Framework各种jar包官网下载2024年最新下载官方渠道。

Spring其实就是一个大家族&#xff0c;它包含了Spring Framework&#xff0c;Spring Boot等一系列技术&#xff0c;它其实就是由许许多多的jar包构成&#xff0c;我们要使用Spring的框架&#xff0c;就要去下载支持这个框架的jar包即可。 1.官网下载Spring Framework的jar包 官…...

【Unity】RPG2D龙城纷争(十三)升级系统

更新日期:2024年7月16日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、升级系统数据集1.升级公式2.获得经验值公式3.预览所有等级经验值二、为关卡配置升级系统三、玩家角色获得经验事件四、玩家角色升级事件五、计算玩家角色获得经验值六、计算玩家角色是…...

保障低压设备安全!中国星坤连接器精密工艺解析!

在现代电子设备中&#xff0c;连接器扮演着至关重要的角色&#xff0c;它们是电子系统之间沟通的桥梁。随着技术的发展&#xff0c;对连接器的需求也在不断提升&#xff0c;特别是在低电压应用领域。中国星坤最新推出的低压连接器&#xff0c;以其精密性和安全性&#xff0c;为…...

中国星坤X0800HI系列线对板连接器:创新技术连接,引领智能家居未来!

近日&#xff0c;中国星坤推出的X0800HI系列线对板连接器&#xff0c;凭借其独特的设计和卓越的性能&#xff0c;引起了业界的广泛关注。 X0800HI系列线对板连接器在极小空间内实现了线对板的W-B连接&#xff0c;这不仅解决了传统连接方式中剥线和焊接的繁琐步骤&#xff0c;还…...

SPring Boot整合第三方框架

springboot整合第三方框架 1. 整合mybatis 1.1引入依赖——pom.xml配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instanc…...

读取sqlserver数据库中varbinary(max)类型的内容,并将图片信息显示在前端页面

目录 1.varbinary(max)的说明 2.图片显示 3.总结 1.varbinary(max)的说明 varbinary(max) 是一种SQL Server数据库字段类型&#xff0c;用于存储二进制数据&#xff0c;可以存储最大长度的二进制数据。以下是关于 varbinary(max) 的说明&#xff1a; 存储容量: 可以存储最大…...

orcad导出pdf 缺少title block

在OrCAD中导出PDF时没有Title Block 最后确认问题在这里&#xff1a; 要勾选上Title Block Visible下面的print...

XML 验证器:确保数据完整性和准确性的关键工具

XML 验证器&#xff1a;确保数据完整性和准确性的关键工具 引言 在当今数字化时代&#xff0c;数据的有效管理和交换至关重要。XML&#xff08;可扩展标记语言&#xff09;作为一种用于存储和传输数据的语言&#xff0c;广泛用于各种应用程序和系统之间。为确保XML数据的完整…...

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合

一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500&#xff0c;w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中&#xff0c;可以使用VideoCapture来读取视频文件&#xff0c;或是摄像头数…...

数据结构——单链表详解(超详细)(2)

前言&#xff1a; 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现&#xff0c;不过为了保证文章的简洁&#xff0c;小编把它分成了两篇来写&#xff0c;这一篇小编紧接上一篇文章继续写单链表函数功能的实现&#xff1a; 目录&#xff1a; 1.单链表剩余函数的编写 1.…...

类和对象(2

*续上文中的运算符重载 4 重载运算符时,有前置和后置的,运算符重载的函数名都是operator, 无法很好区分 所以c规定,后置重载时,增加一个int形参 与前置做区分 5 重载<<和>>时需要重载为全局函数, 因为重载为成员函数时, this指针默认抢占了第一个形参位, 第一个形参…...

AcWing 668. 游戏时间2

读取四个整数 A,B,C,D&#x1d434;,&#x1d435;,&#x1d436;,&#x1d437;&#xff0c;用来表示游戏的开始时间和结束时间。 其中 A&#x1d434; 和 B&#x1d435; 为开始时刻的小时和分钟数&#xff0c;C&#x1d436; 和 D&#x1d437; 为结束时刻的小时和分钟数。…...

AI发展下的伦理挑战,应当如何应对?

针对人工智能&#xff08;AI&#xff09;发展中面临的伦理挑战&#xff0c;构建一个全面、有效的治理体系至关重要。以下是对三大关键方向——隐私保护、算法公正与透明度、深度伪造管控——的深入探讨与具体实践方案&#xff1a; 方向一&#xff1a;构建可靠的AI隐私保护机制…...

Java面试题--JVM大厂篇之深入解析JVM中的Serial GC:工作原理与代际区别

目录 引言&#xff1a; 正文&#xff1a; 一、Serial GC工作原理 年轻代垃圾回收&#xff08;Minor GC&#xff09;&#xff1a; 老年代垃圾回收&#xff08;Major GC或Full GC&#xff09;&#xff1a; 二、年轻代和老年代的区别 年轻代&#xff08;Young Generation&a…...

网络安全高级工具软件100套

1、 Nessus&#xff1a;最好的UNIX漏洞扫描工具 Nessus 是最好的免费网络漏洞扫描器&#xff0c;它可以运行于几乎所有的UNIX平台之上。它不止永久升级&#xff0c;还免费提供多达11000种插件&#xff08;但需要注册并接受EULA-acceptance–终端用户授权协议&#xff09;。 它…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...