【C++】学习笔记——C++的类型转换

文章目录

  • 二十三、C++的类型转换
    • 1. C语言中的类型转换
    • 2. C++类型转换
      • static_cast
      • reinterpret_cast
      • const_cast
      • dynamic_cast
  • 未完待续


二十三、C++的类型转换

1. C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。
隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。
显式类型转化:需要用户自己处理的转换。

 void Test ()
{int i = 1;// 隐式类型转换double d = i;printf("%d, %.2f\n" , i, d);int* p = &i;// 显示的强制类型转换int address = (int) p;printf("%x, %d\n" , p, address);
}

由于类型转换的可视性比较差,难以发觉,于是C++就提出了四种类型转换的关键字。

2. C++类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的类型转换操作符:
static_castreinterpret_castconst_castdynamic_cast

static_cast

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

#include <iostream>
using namespace std;int main()
{double d = 12.34;// 将double转换成intint a = static_cast<int>(d);cout << a << endl;return 0;
}

在这里插入图片描述

reinterpret_cast

reinterpret_cast操作符通常用于将一种类型转换为另一种不同的类型,相当于C语言的显示(强制)类型转换。

#include <iostream>
using namespace std;int main()
{double d = 12.34;int a = static_cast<int>(d);cout << a << endl;int* p = reinterpret_cast<int*>(a);cout << p << endl;return 0;
}

在这里插入图片描述

const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值。

#include <iostream>
using namespace std;int main()
{// 不让编译器优化,避免将const值存到寄存器中volatile const int a = 2;int* p = const_cast<int*>(&a);*p = 3;cout << a << endl;cout << p << endl;return 0;
}

在这里插入图片描述

dynamic_cast

dynamic_cast主要用于继承中。子类转换成父类时,根据赋值兼容规则,是可以直接转换的。但是父类只能转换父类,父类转换子类并不是安全的。而dynamic_cast类型转换则可以帮助检测,如果是父类转换成子类则会返回0。如果安全则正常转换。

#include <iostream>
using namespace std;class A
{
public:virtual void f() {}
};class B : public A
{};void fun(A* pa)
{// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回B* pb1 = static_cast<B*>(pa);B* pb2 = dynamic_cast<B*>(pa);cout << "pb1:" << pb1 << endl;cout << "pb2:" << pb2 << endl;
}
int main()
{A a;B b;fun(&a);fun(&b);return 0;
}

在这里插入图片描述

C语言的强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,我们应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。强烈建议:避免使用强制类型转换。


未完待续

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

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

相关文章

声学改造后的气膜馆:提升体验的独特优势—轻空间

气膜馆因其快速建造、低成本和灵活性&#xff0c;近年来广泛应用于各种运动和活动场所。然而&#xff0c;传统气膜馆在声学表现上存在一些挑战&#xff0c;例如回声和噪音的控制。随着声学改造技术的应用&#xff0c;气膜馆的声学环境得到了显著改善。轻空间将探讨声学改造后的…

轨迹优化 | 基于ESDF的共轭梯度优化算法(附ROS C++/Python仿真)

目录 0 专栏介绍1 数值优化:共轭梯度法2 基于共轭梯度法的轨迹优化2.1 障碍约束函数2.2 曲率约束函数2.3 平滑约束函数3 算法仿真3.1 ROS C++实现3.2 Python实现0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、…

2024年对初学者友好的4款视频剪辑软件不容错过

在这个视觉当道的时代&#xff0c;视频剪辑不再是专业人士的专属领域。随着技术的进步&#xff0c;现在即使是初学者也能轻松上手&#xff0c;发挥自己的创意。今天&#xff0c;我来给大家推荐四款在2024年非常适合初学者使用的视频剪辑软件&#xff0c;让你的创意能够在指尖轻…

Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules。Android studio纯java代码报错

我使用java代码 构建项目&#xff0c;初始代码运行就会报错。我使用的是Android Studio Giraffe&#xff08;Adroid-studio-2022.3.1.18-windows&#xff09;。我在网上找的解决办法是删除重复的类&#xff0c;但这操作起来真的太麻烦了。 这是全部报错代码&#xff1a; Dupli…

VLC实现视频文件转RTSP流

1.选择本地文件 2.创建流 现在已经开始推流了&#xff1a; 3.播放上面创建的流 访问地址&#xff1a;rtsp://:8554/test111

dfs,CF 196B - Infinite Maze

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 https://codeforces.com/problemset/problem/196/B 二、解题报告 1、思路分析 考虑如何判断一条路径可以无限走&#xff1f; 我们对朴素的网格dfs改进&#xff0c;改进为可以dfs网格外的区域 如果存在某个…

免费分享:全国传统村落空间分布数据(附下载方法)

数据简介 本数据是在中国传统村落名录的基础上&#xff0c;通过地理编码&#xff0c;制作成具有空间坐标信息的矢量数据。 数据属性 数据名称&#xff1a;全国传统村落空间分布数据数据时间&#xff1a;2012年至今&#xff0c;更新至第五批空间位置&#xff1a;全国数据格式&…

模拟自然光照:饮料稳定性测试的创新方法

饮料添加剂的光照稳定性测试旨在评估其在光照影响下的保持稳定性的能力&#xff0c;特别是在储存期间。此测试有助于制造商理解饮料在不同光源作用下的变化&#xff0c;例如颜色、口感、香气等感官性质的变化&#xff0c;以及营养成分的衰变速率。这些信息对改进产品配方、包装…

与树莓派的“黄金”关系,是如何帮助这家医疗设备公司扩大规模

稳定的供应和与Raspberry Pi的“黄金”关系帮助医疗设备公司进行了规模扩张 埃及医疗设备制造商Bio Business需要将物联网功能集成到其成功的患者监测设备系列中。Raspberry Pi技术使他们得以实现。 解决方案 RP2040 Compute Module 4 企业规模 中小企业 行业 医疗技术 …

怎么挑选适合企业的安全管理软件?2024值得推荐的5款安全管理软件?

在企业安全管理时&#xff0c;你是否遇到过以下问题&#xff1a; 工作点多面广&#xff0c;信息整理和分析的工作量大&#xff0c;手工处理繁杂耗时&#xff1b; 传统巡检方式&#xff0c;无法保证巡检过程结果真实性&#xff1b; 纸质记录不清晰&#xff0c;问题改进缺乏数…

使用SpaceDesk实现iPad成为电脑拓展屏(保姆级教程)

使用SpaceDesk实现iPad成为电脑拓展屏 SpaceDesk是一个开源的软件, 所以说对学生和平民用户非常的友好, 连接后的画质也非常不错, 而且具有无线和有线两种连接方式. 接下来就开始教程: 1. 安装SpaceDesk电脑版 首先我们要下载SpaceDesk电脑版安装好: SpaceDesk官网 注意: …

2006-2022年中国农村经营管理年报

2006-2022年中国农村经营管理年报 1、时间&#xff1a;2006-2022年 2、格式&#xff1a;2006-2014年为EXCEL&#xff0c;2015-2022年为PDF 3、说明&#xff1a;根据农村经营管理情况统计报表制度调查数据整理、编辑的。本资料系统收录了全国各省、自治区、直辖市农村集体经济…

https执行过程,特点,作用

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

【Spring Boot】手撕搜索引擎项目,深度复盘在开发中的重难点和总结(长达两万6千字的干货,系好安全带,要发车了......)

目录 搜索引擎搜索引擎的核心思路 一、解析模块1.1 枚举所有文件1.2 解析每个文件的标题&#xff0c;URL以及正文1.2.1 解析标题1.2.2 解析URL1.2.3 解析正文 1.3 线程池优化代码 二 、创建排序模块2.1 构建正排索引2.2 构建倒排索引2.3 序列化2.4 反序列化 三、搜索模块3.1 引…

86. UE5 RPG 技能面板实现监听数据

在上一篇文章里&#xff0c;我们创建了技能面板的控制器&#xff0c;接下来&#xff0c;我们将实现通过控制器绑定委托&#xff0c;来更新显示内容。 更新技能面板应用的技能 我们首先更新技能面板上面已经应用的技能&#xff0c;让其和WBP_Overlay上面一样&#xff0c;可以更…

ELK+filebeat

ELKfilebeat 一、filebeat概述 1、filebeat概念&#xff1a; filebeat日志收集工具和logstash相同 filebeat是一款轻量级的日志收集工具&#xff0c;可以在非JAVA环境下运行。 因此&#xff0c;filebeat常被用在非JAVAf的服务器上用于替代Logstash&#xff0c;收集日志信息。…

产品经理NPDP好考吗?

NPDP是新产品开发专业人员的资格认证&#xff0c;对于希望在产品管理领域取得认可的专业人士来说&#xff0c;NPDP认证是一项重要的资格。 那么&#xff0c;产品经理考取NPDP资格认证究竟难不难呢&#xff1f; 首先&#xff0c;NPDP考试的难易程度取决于考生的背景和准备情况…

谷粒商城实战笔记-105~107-全文检索-ElasticSearch-入门

文章目录 一&#xff0c;105-全文检索-ElasticSearch-入门-_cat二&#xff0c;106-全文检索-ElasticSearch-入门-put&post新增数据三&#xff0c;107-全文检索-ElasticSearch-入门-get查询数据&乐观锁字段1&#xff0c;过时的乐观锁-version2&#xff0c;Elasticsearch…

计算机网络知识点面试总结4

#来自ウルトラマンゼロ&#xff08;赛罗&#xff09; 1 传输层提供的服务 1.1 功能 传输层向它上面的应用层提供通信服务&#xff0c;它属于面向部分的最高层&#xff0c;同时也是用户功能中的最底层。 为运行在不同主机上的进程之间提供了逻辑通信。 传输层的功能&#xff1…

【教程】从零开始用QT简易实现modbus通信

前言&#xff1a;本文旨在让读者了解在qt6中实现modbus通信主要使用哪些函数&#xff0c;需要引用哪些库和头文件&#xff0c;不对modbus协议进行介绍&#xff0c;仅在代码层面简单实现一个modbus通信案例 实现效果&#xff1a;点击读取按钮可以读取从机中的十个寄存器&#x…