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

static_cast、dynamic_cast和reinterpret_cast区别和联系

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

于是,我尝试着问了一下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.kler.cn/a/15031.html

相关文章:

  • 解决 Cannot read properties of undefined报错
  • 【QT实战】加解密文件夹之————应用程序获取管理员权限
  • 蓝桥杯每日真题 - 第16天
  • 【蓝桥杯C/C++】I/O优化技巧:cin.tie(nullptr)的详解与应用
  • 环形缓冲区 之 STM32 串口接收的实现
  • 基于Java Springboot外卖平台系统
  • 最好用的六款虚拟机软件,赶紧收藏
  • SAP-选择实施离散制造模式还是重复制造模式?
  • Java 版企业工程项目管理系统平台(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
  • 根据字符出现频率排序、从英文中重建数字----2022/4/25
  • 直击德国PLS展,联诚发倾力打造沉浸式视觉盛宴!
  • 上传了ipa但iTunes Connect没有构建版本问题
  • 巧用千寻位置GNSS软件|逐点放样应用技巧
  • U盘安装Windows11和ubuntu20.04双系统
  • 如何平衡倾斜摄影的三维模型轻量化数据文件大小和质量效果?
  • 设计模式-门面模式
  • BM38-在二叉树中找到两个节点的最近公共祖先
  • Android 11.0 framework中Launcher的启动流程分析
  • 大数据专业好找工作么
  • Java——两个链表的第一个公共节点
  • 局域网 - CSMA/CD(载波侦听多路访问 / 冲突检测)
  • VBA-自定义面板,使用SQL查询Excel数据
  • 大公司为什么禁止SpringBoot项目使用Tomcat?
  • 记录-使用双token实现无感刷新,前后端详细代码
  • 【PLC】贝加莱PLC理论及操作年度培训
  • 波奇学Linux:Linux的认识和云服务器使用