static_cast、dynamic_cast和reinterpret_cast区别和联系

news2024/11/26 8:47:59

其实网上相关的资料不少,但是能够说清楚明白这个问题的也不多。

于是,我尝试着问了一下AI,感觉回答还可以,但是需要更多的资料验证。

 

让我们先看看AI是怎么回答这个问题的。

static_castdynamic_castreinterpret_cast都是C++中用于类型转换的关键字,它们之间的区别和联系如下:

  • static_cast:用于基本类型之间的转换,以及在相关类型之间进行显式转换。如果转换不安全,则会发出警告,但在编译时不会发生任何错误。static_cast也可以用于多个继承层次之间的转换,但是在这种情况下,它的安全性不如dynamic_cast
  • dynamic_cast:用于将基类指针(或引用)转换为派生类指针(或引用)。它只能用于多态类型之间的转换,并且只有在运行时才会执行。如果转换无效,则返回空指针(如果转换为指针类型)或引发异常(如果转换为引用类型)。
  • reinterpret_cast:用于执行低级别的类型转换,例如将指针转换为整数,或将整数转换为指针。它的使用应该受到限制,因为它可以导致未定义的行为。

总之,static_castdynamic_cast是更安全和更灵活的执行类型转换的方式,而reinterpret_cast应该只在必要时使用。

以下是两个 C++ 代码示例,演示了将指向不同类型的指针进行强制转换时会导致的问题:

int a = 42;
double* b = (double*)&a;
double c = *b;
std::cout << c << std::endl; // 可能输出错误的浮点数值,因为指针 b 指向了一个 int 变量,但被强制转换为 double 类型指针

struct A { int x; };
struct B { int y; };

A a;
B* b = (B*)&a;
int c = b->y;
std::cout << c << std::endl; // 可能输出意料之外的值,因为结构体 A 和 B 中的成员变量不同,但被强制转换为 B* 类型指针

在这些情况下,强制转换可能会导致未定义的行为,例如访问无效的内存位置或引发段错误。因此,应避免在这些情况下使用强制转换,而应使用static_castdynamic_cast,或者重新设计应用程序以避免需要进行此类转换。

下面我加入了自己实测的代码:

#include <iostream>

class CBase
{
public:
	CBase();
	~CBase();

private:

};

CBase::CBase()
{
}

CBase::~CBase()
{
}

class CInherit : public CBase
{
public:
	CInherit();
	~CInherit();

private:

};

CInherit::CInherit()
{
}

CInherit::~CInherit()
{
}

class CAnotherBase
{
public:
	CAnotherBase();
	~CAnotherBase();

private:

};

CAnotherBase::CAnotherBase()
{
}

CAnotherBase::~CAnotherBase()
{
}

int main()
{
	int nInt = 0;
	double dDouble = 0.0;

	CBase base;
	CInherit inherit;
	CAnotherBase anotherBase;

	CBase* pBase = &base;
	CInherit* pInherit = &inherit;
	CAnotherBase* pAnotherBase = &anotherBase;

	dDouble = static_cast<double>(nInt);
	nInt = static_cast<int>(dDouble);
	//dDouble = dynamic_cast<double> (nInt);	//失败
	//nInt = dynamic_cast<int>(dDouble);	//失败

	pBase = static_cast<CBase*>(pInherit);
	pInherit = static_cast<CInherit*>(pBase);

	pBase = dynamic_cast<CBase*>(pInherit);
	//pInherit = dynamic_cast<CInherit*>(pBase);	//失败

	//pAnotherBase = static_cast<CAnotherBase*>(pBase);	//失败
	//pAnotherBase = dynamic_cast<CAnotherBase*>(pBase);	//失败

    std::cout << "Hello World!\n";
}

失败部分是关键,需要逐个看,思考,时间问题就不总结了,欢迎交流与讨论。

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

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

相关文章

“SCSA-T学习导图+”系列:路由技术之OSPF入门

本期引言&#xff1a; 路由技术是网络环境中&#xff0c;为不同的节点传输数据提供传输路径的技术&#xff0c;企业网络的拓扑一般会比较复杂&#xff0c;不同的部门或者总部和分支可能处于不同的网段中&#xff0c;此时就需要使用路由协议来连接不同的网段&#xff0c;实现数…

Parker机电产品(运动控制/伺服电机/直线电机)在FPD行业应用

Parker新控制器-PAC PAC集高级逻辑控制&#xff0c;多轴运动&#xff0c;信号处理和webpublished可视化功能。 采用工业主流的EtherCAT运动控制协议&#xff0c;I/O扩展和第三方设备链接&#xff0c;结合应用开发软件PARKERAutomation Manager &#xff0c; PAC能为OEM需要的…

微信仿真平台的设计和实现(设计+源码)_kaic

摘要 现如今&#xff0c;科技的发展带动着环保方式的更新&#xff0c;Internet是一个不断的开展和不停的扩充数据潮流&#xff0c;有了它&#xff0c;我们可以快速、容易地在世界的任何角落进行沟通&#xff0c;获取更多的信息与资料。Internet可以提供大量信息资源和文案数据库…

临近五一,游玩地点想好了吗,Python帮你查找旅游景点的详细数据

前言 好不容易没有了疫情&#xff0c;三年整整三年&#xff0c;都要把我憋死了&#xff0c;想到去年暑假的时候&#xff0c;准备去厦门&#xff0c;攻略做好了&#xff0c;厦门疫情来了&#xff0c;想着转去济南也是这样&#xff0c;去三亚&#xff0c;结果收到好几万人都被留…

5G网络切片路由选择策略介绍

终端保存的NSSP(Network Slice Selection Policy)策略来源于网络侧。 NSSP规则是将应用程序匹配到S-NSSAI(Single network slice selection assistance information),并将应用程序绑定到现有PDU会话或发起新的PDU会话。 NSSP功能 NSSP的作用就是为应用程序选择S-NSSAI和…

HashMap如何解决哈希冲突

HashMap如何解决哈希冲突 Hash算法和Hash表Hash冲突解决哈希冲突的方法开放地址法链式寻址法再hash法建立公共溢出区 Hash算法和Hash表 Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。 Hash表又称为“散列表”&#xff0c;它是通…

LVS负载均衡群集部署——DR直接路由

目录 一、LVS-DR模式二、LVS-DR模式的特点三、LVS-DR中的ARP问题 二、LVS负载均衡群集-DR模式部署1.配置nfs共享&#xff08;192.168.154.10&#xff09;2.部署第一台nginx服务&#xff08;192.168.154.11&#xff09;3.部署第二台nginx服务&#xff08;192.168.154.12&#xf…

React入门学习

参考资料&#xff1a;https://bright-boy.gitee.io/technical-notes/#/react/React%E5%85%A5%E9%97%A8 https://github.com/xzlaptt/React react学习01: https://docs.qq.com/doc/DSG1jdUJtQ3FYR1V1 react学习02: https://docs.qq.com/doc/DSGhGZk9PUm1KVldv React简介 框架定…

滚动数组-动态规划之-不同路径 II_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中&#xff0c;从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度&#xff0c;更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用&#xff0c;在常规的动态规划中&#xff0…

SpringBoot+Vue 前后端分离 微服务项目 打包部署全流程(原始部署/宝塔部署)

前端打包部署 前端项目为vue项目&#xff0c;使用vue admin template作为后台管理模板进行开发。 前端打包 了解开发环境、生产环境&#xff0c;修改生产环境的配置 在开发的时候&#xff0c;往往使用本地电脑进行开发。但是项目上线的时候&#xff0c;需要部署到云服务器中…

基于二阶锥规划(SOCP)松弛和线性离流的配电网规划(DNP)方法示例(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 配电网最优潮流 Optimal Power Flow, OPF) 问题是指在满足一定约束条件的情况下&#xff0c;通过控制配电网中的可控变量&…

内网Nexus代理docker-ce(yum) 源私有仓库 + 内网设备配置(centos)

配置docker-ce源 这里也是以阿里云的docker-ce源为例。 源地址为&#xff1a;https://mirrors.aliyun.com/docker-ce/linux/centos 1、在nexus上配置代理 Nexus上创建Blob Stores 创建Repositories 点击设置 - -> Repositories -- > Create repository --> yum(p…

分布式消息队列Kafka(二)- 生产者

1.生产者消息发送流程 &#xff08;1&#xff09;消息发送原理 ​ 在消息发送的过程中&#xff0c;涉及到了两个线程——main线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c;Sender 线程不断…

刘浩:当谈到RTO < 8s时,OceanBase究竟在说什么?

本文为 OceanBase 高级技术专家刘浩在第一届 OceanBase 开发者大会带来的分享。欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 3 月 25 日&#xff0c;第一届 OceanBase 开发者大会在北京举行&#xff0c;OceanBase 高级技术专家刘浩为大家带来了…

VuePress打包后没有样式或者没有图片或者js加载失败

原因是没有部署到服务器上&#xff01;&#xff01;&#xff01; 这可能是我们打包后的东西 直接点击index.html 变成这样了&#xff01;&#xff01;什么样式都没有了&#xff0c;怎么办那&#xff1f; 很简单&#xff0c;找个服务器部署以下就什么都有了&#xff01;&…

NC 打开系统提示“安全日志数据源异常,请联系环境管理员处理”

问题&#xff1a;NC 用的是sql sever数据库&#xff0c;在sysConfig中正常配置好数据源后&#xff0c;点击测试&#xff0c;测试通过&#xff0c;但是打开系统后还提示“安全日志数据源异常&#xff0c;请联系环境管理员处理”&#xff0c;如下图&#xff1a; 原因&#xff1a;…

echarts 画中国地图

数据可视化平台&#xff0c;中国各省数据和坐标 阿里云可视化 效果 使用echart画中国地图&#xff0c;步骤如下 1.安装依赖 npm i echarts4 创建一个js文件 当你可以访问https请求的时候则使用&#xff0c;如下代码 import axios from "axios"; export default a…

网络安全SSRF漏洞 检测

SSRF 检测的一些思考 DNS 平台没有立刻收到请求&#xff0c;是在之后的某个时间段收到了不同的请求信息&#xff0c;这至少表明了一点&#xff0c;此处存在有无回显的 SSRF&#xff0c;虽然想要证明有更大的危害比较困难&#xff0c;但是至少说明了存在有 SSRF 的风险&#xf…

AI机器人ChatGPT使用体验(注册,使用,简易方式)

最近ChatGPT很火 号称下一代搜索引擎 吊打谷歌百度 它可以做到代替很多职业 究竟有多厉害呢&#xff1f; 看看这个例子&#xff1a; 你问他答&#xff0c;是不是感觉啥都知道&#xff1f; 文员、程序员全被打败 这个究竟怎么用呢&#xff1f; 注册 国内99%的人都卡在了…

超详细Docker的安装以及Docker部署C++

系列文章目录 这学期&#xff0c;学校开了一门云计算大数据课程&#xff0c;老师要求从OpenStack、Hadoop、Docker等软件进行部署一个框架。 我去从中选择了一个Docker&#xff0c;来对这个作业进行实现。以下就是我对这次作业的实现过程以及注意事项&#xff0c;还有犯的错误总…