命名强制类型转换

命名强制类型转换

1. static_cast

static_cast 主要用于编译时的类型转换,它通常用于类层次结构中的相关类型、基本数据类型之间的转换以及一些隐式类型转换的显式表示。

任何具有明确的类型转换,只要不包含底层const,都可以使用static_cast。一般,如果编译器发现一个较大的算术类型企图赋值给较小的类型,就会给出警告信息,但使用static_cast,警告信息就会被关闭。

double doubleValue = 3.14;
int intValue = static_cast<int>(doubleValue);

static cast对于编译器无法自动执行的类型转换也非常有用。例如,我们可以使用static cast 找回存在于 void*指针中的值:

void*p= &d;//正确:任何非常量对象的地址都能存入void
//正确:将void*转换回初始的指针类型
double *dp=static_cast<double*>(p);

当我们把指针存放在 void*中,并且使用static cast将其强制转换回原来的类型时,应该确保指针的值保持不变。也就是说,强制转换的结果将与原始的地址值相等,因此我们必须确保转换后所得的类型就是指针所指的类型。类型一旦不符,将产生未定义的后果。

2. dynamic_cast

dynamic_cast 用于在运行时进行安全的类型转换,特别用于处理多态类层次结构。它要求类中至少有一个虚函数,并且允许在派生类指针或引用和基类之间进行安全的向上或向下转型。

dynamic cast运算符(dynamic cast operator)的使用形式如下所示:

  • dynamic_cast<type*>(e)
  • dynamic_cast<type&>(e)
  • dynamic_cast<type&&>(e)

其中,type必须是一个类类型,并且通常情况下该类型应该含有虚函数。在第一种形式中e必须是一个有效的指针;在第二种形式中,e必须是一个左值;在第三种形式中,e不能是左值。

在上面的所有形式中,e的类型必须符合以下三个条件中的任意一个:e的类型是目标e的公有派生类、e的类型是目标tpe的公有基类或者e的类型就是目标bpe的类型。如果符合,则类型转换可以成功。否则,转换失败。如果一条dynamic cast语句的转换目标是指针类型并且失败了,则结果为0。如果转换目标是引用类型并且失败了,则 dynamic_cast 运算符将抛出一个bad_cast异常(因为不存在所谓的空引用)。

if(Derived *dp=dynamic_cast<Derived*>(bp)){//使用dp指向的 Derived 对象
}else{//bp 指向一个Base 对象//使用bp指向的 Base对象
}
//如果bp指向 Derived对象,则上述的类型转换初始化dp并令其指向bp所指的Derived对象。此时,if语句内部使用Derived操作的代码是安全的。否则,类型转换的结果为0,dp为0意味着if语句的条件失败,此时else 子句执行相应的 Base 操作。

值得注意的一点是,我们在条件部分定义了dp,这样做的好处是可以在一个操作中同时完成类型转换和条件检查两项任务。而且,指针dpif语外部是不可访问的。一旦转换失败,即使后续的代码忘了做相应判断,也不会接触到这个未绑定的指针,从而确保程序是安全的。

void f(const Base &b){try {const Derived &d=dynamic_cast<const Derived&>(b);//使用b引用的Derived对象}catch(bad_cast){//处理类型转换失败的情况}

dynamic_pointer_cast 智能指针由基类转为派生类指针

#include <iostream>int main() {// 创建一个派生类对象的 shared_ptrstd::shared_ptr<Base> basePtr = std::make_shared<Derived>();// 使用 dynamic_pointer_cast 进行类型转换std::shared_ptr<Derived> derivedPtr = std::dynamic_pointer_cast<Derived>(basePtr);if (derivedPtr) {// 转换成功std::cout << "Dynamic cast successful." << std::endl;} else {// 转换失败std::cout << "Dynamic cast failed." << std::endl;}return 0;
}

3. const_cast

const_cast 主要用于添加或移除 const 限定符。它用于在需要时进行常量性转换,但在进行此类转换时应谨慎,因为可能导致未定义的行为。

只有const_cast能改变表达式的常量属性,使用其他形式的命名强制类型转换改变表达式的常量属性都将引发编译器错误。同样的,也不能用const_cast改变表达式的类型:

const int* constIntPtr = new const int(42);
int* intPtr = const_cast<int*>(constIntPtr);

4. reinterpret_cast

reinterpret_cast通常为运算对象的位模式提供较低层次上的重新解释,用于进行底层的、不安全的类型转换,通常用于指针或引用之间的转换,以及整数和指针之间的转换。这种转换是非常低级的,可能会导致未定义的行为,因此在使用时需要非常小心。

int intValue = 42;
double* doublePtr = reinterpret_cast<double*>(&intValue);

注意事项:

  • 尽量避免使用 reinterpret_cast,因为它进行了非常低级别的转换,容易引起错误。
  • 使用 dynamic_cast 时,确保类层次结构中至少有一个虚函数,并且尽量遵循面向对象设计原则。
  • 在使用类型转换时,要谨慎确保转换的安全性,以避免运行时错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/647158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

E7数据库备份和恢复

E7数据库备份和恢复 一、实验目的 在Mysql上&#xff0c;学习如何备份数据库和恢复的各种方法。 二、实验要求: 1、基本硬件配置:英特尔Pentium III 以上,大于4G内存&#xff1b; 2、软件要求:Mysql&#xff1b; 3、时间:1小时&#xff1b; 4、撰写实验报告并按时提交。 三、…

C++刷题日记:Day 1

题目描述 小明是一野生动物园的管理人员&#xff0c;他统计了一份野生动物的名单&#xff0c;糟糕的是&#xff0c;因为操作不当导致打乱了名单&#xff0c;每种野生动物出现的次数都无法进行查询。 小明只能重新进行统计&#xff0c;已知名单中的动物名称只由大小写字母构成&a…

实用工具合集(持续更新...)

一、搜索引擎 1.1、小白盘 网站&#xff1a;https://www.xiaobaipan.com 度盘资源搜索的网站&#xff0c;能够搜索电影、电视剧、小说、音乐等资源&#xff08;注意&#xff1a;评论区很多小伙伴说小白盘有毒&#xff0c;我用谷歌浏览器搜索过几次并无大碍&#xff0c;请慎用…

如何荒废你的2024?

这个演讲题目出人意料&#xff0c;当大家都在想着如何才能获得幸福、快乐、成功的时候&#xff0c;芒格却在跟我们讲“如何获得痛苦&#xff1f;” 为什么&#xff1f; 因为只有知道了自己不想过怎样的生活&#xff0c;才能想尽办法避免它&#xff1b;同样&#xff0c;也只有…

python3-cookbook-查找最大或最小的 N 个元素

第一章&#xff1a;数据结构和算法 Python 提供了大量的内置数据结构&#xff0c;包括列表&#xff0c;集合以及字典。大多数情况下使用这些数据结构是很简单的。但是&#xff0c;我们也会经常碰到到诸如查询&#xff0c;排序和过滤等等这些普遍存在的问题。 因此&#xff0c;这…

C++ day 1

思维导图 使用C编写一个程序&#xff0c;输入一个字符串&#xff0c;统计大小写字母、数字、空格和其他符号的个数 #include <iostream>using namespace std;int main() {int capital 0;int lower 0;int digit 0;int spaces 0;int others 0;cout << "请…

从全流程的角度来了解python包的使用,也许你会有不一样的认识

在python中&#xff0c;只要我们一谈到包或模块&#xff0c;基本默认说的就是包的导入和使用。也就是说只要我们知道包的名字&#xff0c;导入后知道怎么使用基本就可以了&#xff0c;但本人认为&#xff0c;我们仅仅了解的是包的一部分&#xff0c;若想对包有个整体的认识&…

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账

EXCEL VBA调用adobe的api识别电子PDF发票里内容并登记台账 代码如下 使用须知&#xff1a; 1、工具--引用里勾选[Adobe Acrobat 10.0 Type Library] 2、安装Adobe Acrobat pro软件Dim sht As Worksheet Function BrowseFolders() As String 浏览目录Dim objshell As ObjectDim…

小白的AI编程之路

AI初见 这两年各类大模型搜索引擎不断面世&#xff0c;BingChat,ChatGPT等等&#xff0c;网上对其各种神乎其神的描述和各种正面负面的评论纷至沓来&#xff0c;本着百闻不如一见的心态&#xff0c;我也注册了这些搜索引擎&#xff0c;然后开始了和这些AI小助手们的日常。 面…

测试模型分类

测试模型 1. 概述 软件测试和软件开发一样,都遵循软件工程原理,遵循管理学原理,所以理解好软件的开发模型会便于理解测试模型. 软件测试的一般流程: 我们发现一般的软件测试流程和软件开发的流程一样,但是这样的流程测试介入的较晚,对于前期重大的bug很难修复.所以测试的流程…

网工内推 | 急招网工、运维,弹性工作,不加班,最高22K

01 Finogeeks 招聘岗位&#xff1a;运维工程师 职责描述&#xff1a; 1、负责FinClip小程序数字化管理系统产品的POC测试、交付部署、日常巡检工作&#xff0c;包括&#xff1a;交付运维方案、安装部署、数据对接调试、安全事件分析、日常巡检维护等 2、负责FinClip小程序数字…

QCustomPlot开源库使用

1.简介 QCustomPlot是用于绘图和数据可视化的Qt C 小部件。它没有进一步的依赖关系&#xff0c;并且有据可查。该绘图库专注于制作美观&#xff0c;出版质量的2D绘图&#xff0c;图形和图表&#xff0c;以及为实时可视化应用程序提供高性能。看一下“ 设置”和“ 基本绘图”教…

css的flex-direction: column;与direction: rtl;的作用

flex 个人理解 对子元素影响 设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效。 作用自身的样式 1. flex-direction 属性决定主轴的方向(即项目的排列方向) 2. flex-wrap属性定义,如果一条轴线排不下&#xff0c; 如何换行。 3. flex-flow属性…

Java的异常处理

九. 异常处理 1.try - catch 回忆之前我们对异常的使用&#xff0c;我们用异常改变了方法执行流程 public class TestTry {public static void main(String[] args) {System.out.println(1);test(0.0);System.out.println(3);}public static void test(double p) {if(p <…

docker: 修改容器的端口

修改运行中容器的端口 正在运行的容器端口冲突了&#xff0c;但是还需要这个容器&#xff0c;怎么办&#xff1f;只能修改端口了 过程&#xff1a; 停止需要修改的容器 修改hostconfig.json文件 重启 docker 服务 启动修改容器 停止需要修改的容器 [roottest ~]# docke…

猫头虎分享:已解决RuoYi-Vue3 项目代码生成器默认生成代码使用的Vue2模板代码问题与Vue2升级到Vue3解决方案

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

PHP中一些特征函数导致的漏洞总结

第一部分&#xff1a; 特征函数 接触到几个常用的函数&#xff1a; \\ \\\ md5 intval strpos in_array preg_match str_replacephp用这些函数实现过滤一些代码&#xff0c;漏洞可能有一些特性&#xff0c;利用这些特征代码进行对比&#xff1b;账号密码对比&#xff1b;强制检…

npm 报错 request to https://registry.cnpmjs.org/vue failed, reason:

npm 报错 request to https://registry.cnpmjs.org/vue failed, reason:_qq62581587d2bea的技术博客_51CTO博客 本来是非常简单的一个报错。 正常情况下&#xff0c;按照网上的方法就可以解决问题。 但是我尝试了使用代理、换源、重装node.js&#xff08;但是npm的配置参数没…

由于找不到msvcr120.dll,无法继续执行代码

一、msvcr120.dll作用介绍 msvcr120.dll文件是Microsoft Visual C Redistributable Package的一部分&#xff0c;它是一个动态链接库&#xff08;DLL&#xff09;文件。这个文件在Windows操作系统中提供C运行时库支持&#xff0c;包含了大量系统级函数和对象&#xff0c;这些函…

jetson-inference----docker内运行分类任务

系列文章目录 jetson-inference入门 jetson-inference----docker内运行分类任务 文章目录 系列文章目录前言一、进入jetson-inference的docker二、分类任务总结 前言 继jetson-inference入门 一、进入jetson-inference的docker 官方运行命令 进入jetson-inference的docker d…