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 中的一个类型转换操作符,用于在类的层次结构中进行安全的向上转换(从派生类到基类)或进行不需要运行时类型检查的转换。它主要用于基本数据类型之间的转换、对象指针或引用的向上转换(即从派生…...

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

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

深度学习驱动智能超材料设计与应用
在深度学习与超材料融合的背景下,不仅提高了设计的效率和质量,还为实现定制化和精准化的治疗提供了可能,展现了在材料科学领域的巨大潜力。深度学习可以帮助实现超材料结构参数的优化、电磁响应的预测、拓扑结构的自动设计、相位的预测及结构…...
Netty UDP
Netty在UDP(用户数据报协议,User Datagram Protocol)通信中的应用非常广泛,特别是在对实时性要求较高、对数据准确性要求相对较低的场景中,如视频传输、语音通信等。以下是对Netty在UDP通信中的详细解析: …...

Spring Framework各种jar包官网下载2024年最新下载官方渠道。
Spring其实就是一个大家族,它包含了Spring Framework,Spring Boot等一系列技术,它其实就是由许许多多的jar包构成,我们要使用Spring的框架,就要去下载支持这个框架的jar包即可。 1.官网下载Spring Framework的jar包 官…...
【Unity】RPG2D龙城纷争(十三)升级系统
更新日期:2024年7月16日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、升级系统数据集1.升级公式2.获得经验值公式3.预览所有等级经验值二、为关卡配置升级系统三、玩家角色获得经验事件四、玩家角色升级事件五、计算玩家角色获得经验值六、计算玩家角色是…...

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

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

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数据库字段类型,用于存储二进制数据,可以存储最大长度的二进制数据。以下是关于 varbinary(max) 的说明: 存储容量: 可以存储最大…...

orcad导出pdf 缺少title block
在OrCAD中导出PDF时没有Title Block 最后确认问题在这里: 要勾选上Title Block Visible下面的print...
XML 验证器:确保数据完整性和准确性的关键工具
XML 验证器:确保数据完整性和准确性的关键工具 引言 在当今数字化时代,数据的有效管理和交换至关重要。XML(可扩展标记语言)作为一种用于存储和传输数据的语言,广泛用于各种应用程序和系统之间。为确保XML数据的完整…...

opencv学习:图像视频的读取截取部分图像数据颜色通道提取合并颜色通道边界填充数值计算图像融合
一、计算机眼中的图像 1.图像操作 构成像素点的数字在0~255之间 RGB叫做图像的颜色通道 h500,w500 2.灰度图像 3. 彩色图像 4.图像的读取 5.视频的读取 cv2.VideoCapture()--在OpenCV中,可以使用VideoCapture来读取视频文件,或是摄像头数…...

数据结构——单链表详解(超详细)(2)
前言: 上一篇文章小编简单的介绍了单链表的概念和一些函数的实现,不过为了保证文章的简洁,小编把它分成了两篇来写,这一篇小编紧接上一篇文章继续写单链表函数功能的实现: 目录: 1.单链表剩余函数的编写 1.…...
类和对象(2
*续上文中的运算符重载 4 重载运算符时,有前置和后置的,运算符重载的函数名都是operator, 无法很好区分 所以c规定,后置重载时,增加一个int形参 与前置做区分 5 重载<<和>>时需要重载为全局函数, 因为重载为成员函数时, this指针默认抢占了第一个形参位, 第一个形参…...
AcWing 668. 游戏时间2
读取四个整数 A,B,C,D𝐴,𝐵,𝐶,𝐷,用来表示游戏的开始时间和结束时间。 其中 A𝐴 和 B𝐵 为开始时刻的小时和分钟数,C𝐶 和 D𝐷 为结束时刻的小时和分钟数。…...
AI发展下的伦理挑战,应当如何应对?
针对人工智能(AI)发展中面临的伦理挑战,构建一个全面、有效的治理体系至关重要。以下是对三大关键方向——隐私保护、算法公正与透明度、深度伪造管控——的深入探讨与具体实践方案: 方向一:构建可靠的AI隐私保护机制…...

Java面试题--JVM大厂篇之深入解析JVM中的Serial GC:工作原理与代际区别
目录 引言: 正文: 一、Serial GC工作原理 年轻代垃圾回收(Minor GC): 老年代垃圾回收(Major GC或Full GC): 二、年轻代和老年代的区别 年轻代(Young Generation&a…...

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

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

莫兰迪高级灰总结计划简约商务通用PPT模版
莫兰迪高级灰总结计划简约商务通用PPT模版,莫兰迪调色板清新简约工作汇报PPT模版,莫兰迪时尚风极简设计PPT模版,大学生毕业论文答辩PPT模版,莫兰迪配色总结计划简约商务通用PPT模版,莫兰迪商务汇报PPT模版,…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
WebRTC从入门到实践 - 零基础教程
WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC? WebRTC(Web Real-Time Communication)是一个支持网页浏览器进行实时语音…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

2025-05-08-deepseek本地化部署
title: 2025-05-08-deepseek 本地化部署 tags: 深度学习 程序开发 2025-05-08-deepseek 本地化部署 参考博客 本地部署 DeepSeek:小白也能轻松搞定! 如何给本地部署的 DeepSeek 投喂数据,让他更懂你 [实验目的]:理解系统架构与原…...