C++学习笔记----9、发现继承的技巧(七)---- 转换(1)

        我们来看下将一种数据类型转换为另一种数据类型中的一些令人迷惑的地方。

        C++提供了五种类型转换:const_cast(),static_cast(),reinterpret_cast(),dynamic_cast()与std::bit_cast()。对于static_cast对于继承还有一些内容要讨论。现在你应该能够很熟练地书写自己的类,理解了类继承,是时候来详细探索一下这些转换了。

        注意旧的C风格的比如(int)myFloat在C++中仍然可以用,并且在既有代码中还大量使用着。除了bit_cast之外C风格的转换涵盖了所有的转换,因此极易出错,因为并不是很明显地可以获得成功,可能会以非预期的结果结束。在新的代码中强烈推荐使用c++风格,因为更安全,语法更好,代码视觉更好。

1、static_cast()

        可以使用static_cast()来执行语言直接支持的显式转换。例如,如果要写一个算术表达式,需要将int型转换为double型来避免整数除,使用static_cast()。在这个例子中,只要使用i的static_cast()就够了,因为只要使两个操作数中的一个为double就够了,确保c++执行浮点数的除。

int i { 3 };
int j { 4 };
double result { static_cast<double>(i) / j };

        也可以使用static_cast()来执行显式转换也是允许的,使用用户定义的构造函数或转换函数。例如,如果类A有一个构造函数使用类B的对象,可以使用static_cast()将B对象转换为A对象。在大部分你想要这种行为的情况下,不用太多想,编译器会自动执行这种转换。

        static_cast()的另一个用途是在继承层次结构中执行向下转换,示例如下:

class Base
{
public:virtual ~Base() = default;
};class Derived : public Base
{
public:virtual ~Derived() = default;
};int main()
{Base* b{ nullptr };Derived* d{ new Derived{} };b = d; // Don't need a cast to go up the inheritance hierarchy.d = static_cast<Derived*>(b); // Need a cast to go down the hierarchy.Base base;Derived derived;Base& br{ derived };Derived& dr{ static_cast<Derived&>(br) };
}

        这种转换可以用于指针与引用。但对对象自身不可用。

        注意使用static_cast()转换是不执行运行时类型检查的。允许将Base指针转换为指向Derived的指针,或者Base引用转换为Derived引用,即使运行时Base真的不是Derived。例如,下面的代码可以编译并且执行,但是使用指针d可能会造成潜在的灾难性后果,包括对象出界内存覆盖。

Base* b { new Base {} };
Derived* d { static_cast<Derived*>(b) };

        要执行运行时类型检查的安全类型转换,要使用dynamic_cast(),我们后面会讨论。

        static_cast()并不总是强大的。不能将一种类型转换为另一种不相关的类型的指针。如果没有转换构造函数,不能直接将一种类型的对象转换为另一种类型。不能将一个const类型转换为非const类型。不能将指针转换为int。本质上来讲,只能做根据c++类型规则说得通的转换。

2、reinterpret_cast()

        reinterpret_cast()更强大一点儿,但伴随的是安全性降低,相比于static_cast()来讲。可以用其来执行在技术上c++类型规则不允许,但是在某些情况下对程序员来说是说得通的。例如,可以使用reinterpret_cast()来转换一种类型的引用到另一种类型的引用,即使类型是无关的。同样的,可以用其来发了日期指针类型到另外其它指针类型,即使在继承层次结构上是无关的。然而,将指针转换为void*可以隐式执行,而不需要显式转换。将void*转换来正确的类型指针,static_cast()就够了。void*指针只是指向内存中某个位置的指针。没有类型信息与void*指针相关。下面是一些例子:

class X {};
class Y {};int main()
{X x;Y y;X* xp{ &x };Y* yp{ &y };// Need reinterpret_cast for pointer conversion from unrelated classes// static_cast doesn't work.xp = reinterpret_cast<X*>(yp);// No cast required for conversion from pointer to void*void* p{ xp };// static_cast is enough for pointer conversion from void*xp = static_cast<X*>(p);// Need reinterpret_cast for reference conversion from unrelated classes// static_cast doesn't work.X& xr{ x };Y& yr{ reinterpret_cast<Y&>(x) };
}

        reinterpret_cast()并不总是强大的;在什么可以转换为什么上有一些限制。我们就不详细讨论这些限制了,推荐审慎使用这些类型转换。

        通常来说,要小心使用reinterpret_cast(),因为它不执行类型检查而允许做转换。

        警告:可以使用reinterpret_cast()来对指针也整数进行相互转换。然而,只能将指针转换为能够存放该整数的大小的转换。例如,尝试使用reinterpret_cast()来转换一个64位的指针到一个32位的整数会造成编译时错误。

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

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

相关文章

msys2更换国内源(多个文件(不是3个文件的版本!))

msys2更换国内源 起因排查答案如下mirrorlist.mingw64mirrorlist.ucrt64mirrorlist.mingw32mirrorlist.mingwmirrorlist.clang64mirrorlist.clang32mirrorlist.msys 不想看经过的直接跳到答案 起因 查了很多个教程大部分都是【打开MSYS2软件内的\etc\pacman.d\ 中3个文件&…

使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(二) ubuntu的下载安装

首先&#xff0c;Linux系统是人工智能和深度学习首选系统。原因如下: 开放性和自由度&#xff1a;Linux 是一个开源操作系统&#xff0c;允许开发者自由修改和分发代码。这在开发和研究阶段非常有用&#xff0c;因为开发者可以轻松地访问和修改底层代码。社区支持&#xff1a;…

TCP Analysis Flags 之 TCP Keep-Alive

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

Android的SQLiteOpenHelper类 笔记241027

SQLiteOpenHelper SQLiteOpenHelper是Android开发中用于管理SQLite数据库的一个非常重要的工具类。以下是对SQLiteOpenHelper的详细介绍&#xff1a; 一、基本概念 SQLiteOpenHelper是一个抽象类&#xff0c;它主要用于管理数据库的创建和版本管理。通过继承这个类&#xff…

3.2 页面异常-2

系列文章目录 文章目录 系列文章目录IoPageRead() IoPageRead() /** implemented*/ NTSTATUS NTAPI IoPageRead(IN PFILE_OBJECT FileObject,IN PMDL Mdl,IN PLARGE_INTEGER Offset,IN PKEVENT Event,IN PIO_STATUS_BLOCK StatusBlock) {PIRP Irp;PIO_STACK_LOCATION StackPtr;…

关于数学建模的一些介绍

为了更好了解世界&#xff0c;我们可以通过数学来描述许多特定的现象&#xff0c;而数学模型就是现实世界的理想化&#xff0c;不过它永远不能完全精确地表示现实世界。 在这篇文章中&#xff0c;我将介绍一些数学建模的基本概念以及相应的基础知识&#xff0c;而关于更具体的…

CSRA的LINUX操作系统24年11月2日下午上课笔记

压缩和解压缩&#xff1a;zip 、gzip、bz、xz # zip 压缩 # 压缩文件夹 # 解压缩 # unzip -v 查看压缩包中的内容 # bzip2 dir1/* :将dir1中的所有文件压缩 # gzip # 压缩文件夹 # 解压缩 tar 归档命令&#xff1a; # 创建tar包 tar -c*f # 释放tar包 tar -xf[c] # c …

Java JUC(四) 自定义线程池实现与原理分析

目录 一. 阻塞队列 BlockingQue 二. 拒绝策略 RejectPolicy 三. 线程池 ThreadPool 四. 模拟运行 在 Java基础&#xff08;二&#xff09; 多线程编程 中&#xff0c;我们简单介绍了线程池 ThreadPoolExecutor 的核心概念与基本使用。在本文中&#xff0c;我们将基于前面学…

五、SpringBoot3实战(1)

一、SpringBoot3介绍 1.1 SpringBoot3简介 SpringBoot版本&#xff1a;3.0.5 https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot 到目前为止&#xff0c;你已经学习了多种配置Spring程序的方式…

施耐德M310PLC通讯之ModbusTCP(一)

这是另一个专题----施耐德国产化PLC(M310)的通讯篇 本节是ModbusTcp通讯 测试对象: M310plc与M241PLC 通讯协议: ModbusTcp 主站:M310PLC 从站:M241PLC 1.M310端: 1.1 新建工程(M310采用EcoStruxure Motion Expert 软件) 新建工程,这里不区分PLC型号的,只要是M310即…

使用ssh-key免密登录服务器或git代码仓库网站

现在常用的git代码仓库网站&#xff08;简称git站&#xff09;有: gitee、coding、github、gitlab、bitbucket等。 你在git站注册了账号后&#xff0c;可以进入账号设置里面添加ssh-key&#xff0c;从而实现你本地机器免密clone、pull、push你在该git网站的仓库&#xff08;即项…

C#程序开发,使用OpenHardwareMonitor测量 Windows 运行状态

1、数据结构 using System;namespace PcMonitor.Protocol {[Serializable]public class MachineInfo{public CpuInfo Cpu;public MemoryInfo Memory;public GpuInfo Gpu;public MachineInfo(CpuInfo cpu, MemoryInfo memory, GpuInfo gpu){Cpu cpu;Memory memory;Gpu gpu;}…

三、k8s快速入门之Kubectl 命令基础操作

⭐️创建Pod [rootmaster ~]# kubectl run nginx --imageharbor.tanc.com/library/ngix:latest kubectl run --generatordeployment/apps.v1 is DEPRECATED and will be rmoved in a future version. Use kubectl run --generatorrun-pod/v1 or kbectl create instead. deplo…

Spring Boot 集成阿里云直播点播

在当今数字化时代&#xff0c;视频直播和点播服务已经成为许多应用的核心功能。阿里云提供了强大的直播和点播服务&#xff0c;能够满足各种规模的应用需求。而 Spring Boot 作为一种流行的 Java 开发框架&#xff0c;能够快速构建高效的应用程序。本文将详细介绍如何在 Spring…

电能表预付费系统-标准传输规范(STS)(30)

6.5.3.2 CONTROLBlock construction The 1 6 digit CONTROLBlock is constructed from the data elements in the APDU as defined in Table 36 and Table 37.The most significant digit is in position 1 5 and the least significant digit in position 0. APDU中的数据元素…

Jmeter基础篇(19)JSR223预处理器

前言 JSR223预处理器是Apache JMeter中的一个组件&#xff0c;它允许用户使用任何支持Java Scripting API (JSR 223) 的脚本语言来执行预处理任务。这个功能非常强大&#xff0c;因为它让测试人员能够利用如Groovy、JavaScript&#xff08;Nashorn引擎&#xff09;、BeanShell…

Unity GameFramework Star Force 拆解(一)—— 启动流程

文章目录 启动流程&#xff1a;ProcedureLaunch&#xff1a;ProcedureSplash&#xff1a;ProcedureInitResources&#xff1a;ProcedurePreload&#xff1a;ProcedureChangeScene&#xff1a;ProcedureMenu&#xff1a;ProcedureMain&#xff1a; 首先&#xff0c;我是个菜鸡&a…

Python基于TensorFlow实现双向循环神经网络GRU加注意力机制分类模型(BiGRU-Attention分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 随着深度学习技术的发展&#xff0c;循环神经网络&#xff08;RNN&#xff09;及其变种如门控循环…

echart实现地图数据可视化

文章目录 [TOC](文章目录) 前言一、基本地图展示2.数据可视化 总结 前言 最近工作安排使用echarts来制作图形报表&#xff0c;记录一下我的步骤&#xff0c;需求呈现一个地图&#xff0c;地图显示标签&#xff0c;根据业务指标值给地图不同省市填充不同颜色&#xff0c;鼠标放…

数学真题总结

举反例 看清正负号 对应的特征值一致 不用裁开计算行列式要注意符号&#xff01;&#xff01;&#xff01; 根据值的大小确定正负 没有思路就构建tanx求极值要考虑端点线性方程&#xff1a;求通解归并x几何意义 整体思想 u e^x y都设计好了&#xff0c;曲线是f(x,y) 0,直接把…