关于C++的类型转换一篇搞掂

类型转换

本篇主要探讨C++11的新出现的类型转换方式


隐式类型转换(意义相近的类型可转换)
显示类型转换(意义不相近的类型需强制类型转换)

C++为了加强类型转换的可视性, 引入了四种命名强制类型转换操作符
但同时也兼容了C语言之前的类型转换和强制类型转换, 只是提供了规范的转换方式:
(T为要转换为什么类型, 变量即要进行转换的变量)

static_cast(变量)

用于执行非多态类型的转换,或意义相近的类型之间的转换,如整数和浮点数的转换, 如果类型不相近则会报错
tips:static_cast 不会进行运行时类型检查,因此在执行不安全的转换(如向下转型)时可能会导致未定义行为。

reinterpret_cast(变量)

reinterpret: 重新解释; 重新诠释
用于意义不相关之间的类型的转换,(如指针和长整型)
tips:reinterpret_cast 几乎不执行任何类型检查,因此它允许执行不安全的转换。使用 reinterpret_cast 时必须非常小心,因为它可能会破坏类型系统的安全性。

const_cast(变量)

用于去除对象的常量性或挥发性,或向对象添加常量性或挥发性。一般是同类型的const与非const之间转换
常用于去除转换变量的const属性

const int x = 10;  
const int* p = &x; // 指向const int的指针  // 使用const_cast去除const属性  
int* q = const_cast<int*>(p);  
*q = 20; // 现在可以修改x的值(尽管这是不安全的)  // 注意:尝试修改一个真正的const对象(如上面的x)会导致未定义行为  
// 因为x是在一个只读的内存区域(如字符串常量区)中分配的
int y = 30;  
int* r = &y; // 指向int的指针  // 使用const_cast添加const属性(虽然这通常是不必要的)  
const int* s = const_cast<const int*>(r);  
// 现在s是一个指向const int的指针,你不能通过s来修改y的值  
// 但你仍然可以通过r来修改y的值

额外说明:

  • const类型的变量较小时, 会加载到寄存器中提高访问速度, 读该变量时会从寄存器中读取
    (vs下是直接将const变量定义成宏, 进行读时会直接将值代入)
  • 当对内存上的const变量通过某种方式间接修改时, 内存上改变了, 但读该变量时仍是寄存器内的数据

tips: 可以使用volatile关键字修饰const变量, 令编译器不进行优化, 直接取内存中的const变量值。
遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。声明时语法:int volatile vInt;

当要求使用 volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。

dynamic_cast

用于将一个父类对象的指针/引用(原先需是指向或引用子类对象)转换为子类对象的指针/引用(动态转换), 即向下转型

  • dynamic_cast只能用于父类含有虚函数的类(即必须是个多态类型)
  • dynamic_cast会先检查是否能转换成功, 若能成功则转换, 不能成功则返回nullptr(故此使用dynamic_cast是安全的)
    若原先父类指针指向子类对象则可成功转换, 若指向父类对象则会转换失败
  • 向下转换后可以通过该父类指针或引用可访问子类中的成员

tips: 一个父类对象无论如何都无法转换为子类对象的, 能转换的只是指针或者引用

  • RTTI(Run-time Type identification): 运行时类型识别
    • dynamic_cast运算符: 用于识别父类指针指向的是父类对象还是子类对象

    • decltype关键字: 用于获取类型 获取类型后可以再用该类型声明变量
      int x = 10; decltype(x) y1 = 20.22;
      typeid(变量名): 用于获取变量类型的字符串

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

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

相关文章

go升级后 编译的exe在win7上无法正常运行

D:/Go/src/runtime/sys_windows_amd64.s:65 x75 fpx22fca sp-0x22fc8日 升级到go 1.21后报一堆错误&#xff0c;要死了啊 原来是go 1.21不支持win7了&#xff0c;必须把go退回到1.20版本 谷歌发布编程语言 Go 1.21 版本&#xff1a;取消支持微软 Win7/8 及苹果 macOS 10.13/10…

pip install pytorch-quantization error

一 报错信息 最近安装pytorch-quantization报错&#xff0c;安装失败报错信息如下&#xff1a; Looking in indexes: https://pypi.org/simple, https://pypi.ngc.nvidia.com Collecting pytorch-quantizationDownloading pytorch-quantization-2.2.1.tar.gz (6.8 kB)Prepari…

Alibaba Cloud Linux 安装docker

阿里云实例基于 Red Hat 的发行版&#xff08;例如 CentOS 或 Alibaba Cloud Linux&#xff09;。在这种情况下&#xff0c;应该使用 yum 或 dnf 包管理器&#xff0c;而不是 apt。以下是如何在 CentOS 或类似系统上安装 Docker 的步骤&#xff1a; 1. 更新系统 首先&#xf…

网络渗透思考

1. windows登录的明文密码&#xff0c;存储过程是怎么样的&#xff0c;密文存在哪个文件下&#xff0c;该文件是否可以打开&#xff0c;并且查看到密文 windows的明文密码:是通过LSA&#xff08;Local Security Authority&#xff09;进行存储加密的 存储过程:当用户输入密码之…

用C语言实现扫雷

本篇适用于C语言初学者&#xff0c;主要涉及对于函数&#xff0c;数组&#xff0c;分支循环的运用。 目录 设计思想&#xff1a; 总代码&#xff08;改进后&#xff09;&#xff1a; 运行结果展示&#xff1a; 分布介绍&#xff1a; 声明&#xff1a; 代码主体部分&#…

Vue3学习使用axios和qs进行POST请求和响应处理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言1.准备工作2.发送POST请求3.处理响应数据4.总结 一、前言 在前端开发中&#xff0c;经常需要与后端进行数据交互&#xff0c;其中包括发送POST请求并处理响…

Docker - Kafka

博文目录 文章目录 说明命令 说明 Docker Hub - bitnami/kafka Docker Hub - apache/kafka Kafka QuickStart Kafka 目前没有官方镜像, 目前拉取次数最多的 bitnami/kafka, Apache 提供的是 apache/kafka, 本文使用 bitnami/kafka 数据卷数据卷印射在容器内的路径kafka/bitna…

HarmonyOS 鸿蒙应用开发 - 创建自定义组件

开发者定义的称为自定义组件。在进行 UI 界面开发时&#xff0c;通常不是简单的将系统组件进行组合使用&#xff0c;而是需要考虑代码可复用性、业务逻辑与UI分离&#xff0c;后续版本演进等因素。因此&#xff0c;将UI和部分业务逻辑封装成自定义组件是不可或缺的能力。 1、创…

快团团帮卖团长怎么对供货大团长进行评分?

都说帮卖“躺赚”&#xff1f; 一旦遇团不淑&#xff0c;惨遭不靠谱团长挖坑&#xff0c;售后拖延、发货慢、产品瑕疵…… 加上顾客夺命连环催&#xff0c;双面夹击&#xff0c;夹缝生存。供货团长靠不靠谱太重要了&#xff01; 快团团供货团长评分系统上线&#xff01; 帮卖团…

【神经网络优化的策略有哪些???】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、神经网络优化策略总结 前言 神经网络优化是深度学习中至关重要的一部分&#xff0c;它涉及到调整神经网络参数以最小化损失函数。 以下是一些常见的神经网…

ECOLOGY9解决明细表数据按需显示或隐藏

ECOLOGY9:由于领导需要查看完整的明细表数据&#xff0c;没有启用分页功能&#xff0c;导致大领导查看时又出现几百行的数据&#xff0c;影响使用体验。需求&#xff1a;只看正常表单数据&#xff0c;明细表数据&#xff0c;默认不显示&#xff0c;需要查看时再打开。 实现&am…

2024年华为OD机试真题-火星文计算-C++-OD统一考试(C卷D卷)

题目描述: 已知火星人使用的运算符为#、$,其与地球人的等价公式如下: x#y = 4*x+3*y+2 x$y = 2*x+y+3 1、其中x、y是无符号整数 2、地球人公式按C语言规则计算 3、火星人公式中,#的优先级高于$,相同的运算符,按从左到右的顺序计算 现有一段火星人的字符串报文,请…

【RK3288 Android10 T8pro usb hid-multitouch idc配置】

【RK3288 Android10 T8pro usb hid-multitouch idc配置】 文章目录 【RK3288 Android10 T8pro usb hid-multitouch idc配置】背景代码分析1. 读取配置文件2. 标志内外置屏幕3. 设置输入设备4. findviewport()5. 根据对应的viewport来计算相应的mapping的参数 结论 背景 T8pro …

二十三篇:未来数据库革新:AI与云原生的融合之旅

未来数据库革新&#xff1a;AI与云原生的融合之旅 1. 智能数据库管理&#xff1a;AI的魔法 在数字化时代&#xff0c;数据库技术作为信息管理的核心&#xff0c;正经历着前所未有的变革。AI&#xff08;人工智能&#xff09;和云原生技术的融合&#xff0c;正在重新定义数据库…

关于k8s集群的污点和容忍,以及k8s集群的故障排查思路

一 污点(Taint) 和 容忍(Tolerations) &#xff08;一&#xff09;污点 在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;污点&#xff08;Taints&#xff09;是一个重要的概念&#xff0c;用于实现Pod的调度控制。以下是关于污点的详细解释&#xff1a;1.污点定义 污点…

元宇宙vr科普馆场景制作引领行业潮流

在这个数字化高速发展的时代&#xff0c;北京3D元宇宙场景在线制作以其独特的优势&#xff0c;成为了行业内的创新引领者。它能够快速完成空间设计&#xff0c;根据您的个性化需求&#xff0c;轻松设置布局、灯光、音效以及互动元素等&#xff0c;为您打造出一个更加真实、丰富…

【算法】位运算算法——判断字符是否唯一

题解&#xff1a;判断字符是否唯一(位运算算法) 目录 1.题目2.题解3.位图参考代码4.细节5.总结 1.题目 题目链接&#xff1a;LINK 2.题解 题解有两种方法&#xff0c; 一是做一个哈希数组&#xff0c;去查重&#xff1b; 二是直接用一个变量每一位来对应表示是否有这个字母…

Android - failed to set system property

记录一次疏忽&#xff0c;起因是我需要在自定义的 receiver 中保存 property 方便&#xff0c;方便在三方 app 中使用&#xff0c;结果直接崩溃了&#xff0c;虽然结果保存成功了&#xff0c;但是这种情况也是无法接收的&#xff0c;错误日志如下&#xff1a; M006082 05-25 1…

【OpenGL Mathematics(GLM)下载链接】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、OpenGL Mathematics(GLM)二、使用步骤 前言 3D 图形编程会大量使用向量和矩阵代数。因此&#xff0c;配合一个支持常见数学计算任务的函数库或者类包&…

赶紧收藏!2024 年最常见 20道 Rocket MQ面试题(二)

上一篇地址&#xff1a;赶紧收藏&#xff01;2024 年最常见 20道 Rocket MQ面试题&#xff08;一&#xff09;-CSDN博客 三、如何在RocketMQ中保证消息的顺序性&#xff1f; 在RocketMQ中保证消息的顺序性主要通过以下几个方面实现&#xff1a; 1、单线程顺序写入&#xff1a…