当前位置: 首页 > 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;。 它…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...

旋量理论:刚体运动的几何描述与机器人应用

旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比&#xff0c;旋量理论通过螺旋运动的概念统一了旋转和平移&#xff0c;在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观&#xff0c;而且计算…...