【C++】类型转换(dynamic_cast,const_cast,static_cast,reinterpret_cast)

news2024/12/27 12:30:23

🌏博客主页: 主页
🔖系列专栏: C++
❤️感谢大家点赞👍收藏⭐评论✍️
😍期待与大家一起进步!


文章目录

  • C语言中的类型转换
  • 一、static_cast
  • 二、reinterpret_cast
  • 三、 const_cast
  • 四、 dynamic_cast


C语言中的类型转换

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理

缺陷:
转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast

一、static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。

int main()
{
  double d = 12.34;
  int a = static_cast<int>(d);
  cout<<a<<endl;
  return 0;
}

二、reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型

int main()
{
 double d = 12.34;
 int a = static_cast<int>(d);
 cout << a << endl;
 // 这里使用static_cast会报错,应该使用reinterpret_cast
 //int *p = static_cast<int*>(a);
 int *p = reinterpret_cast<int*>(a);
 return 0;
}

三、 const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值
在这里插入图片描述
但这里我们发现打印出来a的值没有加一,这是因为编译器对于const类型修饰的常变量默认其值是不会被修改的,为了加快访问效率,编译器会把常变量的值放入寄存器,每次从寄存器中去读取数据,其实实际在内存中对应的值是变了的了。
在这里插入图片描述

四、 dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

注意:

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

xlive.dll下载安装方法分享,教你快速修复xlive.dll文件

在运行某些应用程序或游戏时&#xff0c;你可能会遭遇到"xlive.dll缺失"错误提示&#xff0c;这可能导致程序无法正常运行。本文将向你介绍一些可行的解决方法教你下载xlive.dll文件&#xff0c;并详细阐述xlive.dll是什么文件以及导致其缺失的原因。 一.理解"x…

2023-10-19 指针与指针的指针,我就不信你脑壳不疼

点击 <C 语言编程核心突破> 快速C语言入门 指针与指针的指针&#xff0c;我就不信你脑壳不疼 前言一、从一个链表实现说起二、指针, 指针的指针, 头疼的来源总结 前言 C实现一个链表&#xff0c;为什么有时候传入指针&#xff0c;有时候传入指针的指针&#xff0c;究竟…

编程接口:eBPF 程序是怎么跟内核进行交互的?

目录 背景 BPF 系统调用 BPF 辅助函数 BPF 映射 BPF 类型格式 (BTF) 小结 背景 用高级语言开发的 eBPF 程序&#xff0c;需要首先编译为 BPF 字节码&#xff0c;然后借助 bpf 系统调用加载到内核中&#xff0c;最后再通过性能监控等接口与具体的内核事件进行绑定。这样&…

VNC Viewer安装教程(保姆级安装)

一、 VNC Viewer简介 VNC是一款开源的远程控制软件&#xff0c;功能强大且高效实用&#xff0c;其性能不逊色同类软件&#xff0c;它的工作原理和WIN远程控制软件类似&#xff0c;但是更为重要的是&#xff0c;VNC-Viewer完全免费开源&#xff0c;更新速度也比较快&#xff01;…

解释CSS伪类和伪元素的区别,并举例说明。

CSS伪类和伪元素是用于选择HTML文档中特定元素或元素的部分内容的CSS选择器。它们的区别在于它们所选择的目标不同。 CSS伪类&#xff08;Pseudo-classes&#xff09;是用于选择符合特定状态或特定条件的元素。伪类以冒号&#xff08;:&#xff09;开头&#xff0c;用于选择元…

【VSCode】解决Open in browser无效

问题描述&#xff1a; 在VSCode中无论是点击右键&#xff0c;选择在默认浏览器中打开&#xff0c;还是按快捷键alt b都没有反应。 解决办法&#xff1a; 右击文件 --> 在文件资源管理器中显示 右击文件&#xff0c;选择属性 点击更改 选择用默认浏览器打开 最后 此时…

Redis 命令—— 超详细操作演示!!!

内存数据库 Redis7 三、Redis 命令3.1 Redis 基本命令3.2 Key 操作命令3.3 String 型 Value 操作命令3.4 Hash 型 Value 操作命令3.5 List 型 Value 操作命令3.6 Set 型 Value 操作命令3.7 有序Set 型 Value 操作命令3.8 benchmark 测试工具3.9 简单动态字符串SDS3.10 集合的底…

Whisper 整体架构图

Attention 注意力机制模块&#xff0c;兼容自注意力和交叉注意力。 AttentionBlock Transformer 模块&#xff0c;包含一个自注意力&#xff0c;一个交叉注意力&#xff08;可选&#xff09;和一个 MLP 模块。 AudioEncoderTextDecoder 音频编码器和文本解码器。编码器的 Tr…

【Unity地编】地形系统搭建入门详解

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;UI_…

【Bug】8086汇编学习

文章目录 随笔Bug1、masm编译报错&#xff1a;Illegal use of register2、debug中使用段前缀3、[idata]在编译器中的处理4、push立即数报错5、报错&#xff1a;improper operand type6、程序莫名跳转到未知位置 (doing)7、DOSBox失去响应8、程序运行显示乱码9、程序运行导致DOS…

Vue中的mixins是什么?

在Vue中,Mixins(混入)是一种可重用的代码块,用于在多个组件之间共享逻辑和功能。通过使用Mixins,可以将一组属性、方法和生命周期钩子等混合到多个组件中,从而实现代码的复用和组件之间的共享功能。 使用Mixins有以下几个步骤: 1:创建Mixins: 创建一个包含共享代码的…

c#中使用Task.WhenAll

&#x1f680;简介 Task.WhenAll用于等待所有提供的Task对象完成执行。这个方法返回一个新的Task&#xff0c;这个Task将在所有提供的Task完成后完成。如果任何一个Task失败&#xff0c;Task.WhenAll返回的Task也将以异常状态完成。这个方法非常适合在你需要并行执行多个操作&…

(二)docker:建立oracle数据库mount startup

这章其实我想试一下startup部分做mount&#xff0c;因为前一章在建完数据库容器后&#xff0c;需要手动创建用户&#xff0c;授权&#xff0c;建表等&#xff0c;好像正好这部分可以放到startup里&#xff0c;在创建容器时直接做好&#xff1b;因为setup部分我实在没想出来能做…

ES6 Promise 详解

目录 一、Promise基本介绍 二、Promise实现多次请求 1.传统Ajax方式实现多次请求 : 1.1 json数据准备 1.2 JQuery操作Ajax 2.使用ES6新特性Promise方式 : 三、Promise代码重排优化 1.问题分析 : 2.代码优化 : 2.1 数据准备 2.2 代码重排 一、Promise基本介绍 (1) Ajax方…

四川农业大学就业指南←缺失的就业指导课

推荐 125页就业指南&#xff0c; 包含就业去向、就业政策介绍&#xff0c; 也有毕业生常见问题&#xff0c; 就业协议与劳动合同的阐释&#xff0c; 帮助毕业生系统梳理庞杂的各类就业信息&#xff0c; 人文温度冲淡就业惨淡的灰冷阴霾。 有这样一群人&#xff0c;在2023&…

联邦学习的梯度重构

梯度泄露的攻击方法&#xff1a;深度泄露梯度&#xff08;DLG&#xff09;——>在高度压缩的场景下是失效的 原因&#xff1a;梯度压缩&#xff08;可减小通信开销&#xff09;——>存在信息损失<——从而DLG方法效果有限 但是这本身存在的信息损失怎么解决呢&#x…

前端刷题 | 网站

W3Cschoolhttps://www.w3cschool.cn/exam 计算机方面的知识涵盖较全 牛客网 应届生招聘题库&#xff0c;校招实习笔试面试真题 力扣 前端方面的题目较为基础&#xff0c;基本不考复杂算法题 稀土掘金https://juejin.cn/search?query%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95&a…

基因表达分析聚类分析

基因表达分析聚类&分析 1. Introduction to gene expression analysis Technology: microarrays vs. RNAseq. Resulting data matricesSupervised (Clustering) vs. unsupervised (classification) learning 微阵列技术&#xff1a; 制备DNA探针阵列并进行互补性杂交。 …

(2)Nmap

笔记目录 渗透测试工具(1)wireshark 渗透测试工具(2)Nmap渗透测试工具(3)Burpsuite 1.工具简介 (1)定义 ①功能 网络扫描和嗅探工具包&#xff0c;三个主要基本功能&#xff1a; 探测一组主机是否在线 扫描主机端口、嗅探所提供的网络服务 推断出主机所用的操作系统 ②namp …

配置Linux

首先安装VMware&#xff1a; 安装说明&#xff1a;&#xff08;含许可证的key&#xff09; https://mp.weixin.qq.com/s/XE-BmeKHlhfiRA1bkNHTtg 给大家提供了VMware Workstation Pro16&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1q8VE3TkPzDnM3u9bkTdA_g 提取码&…