C++——类型转换


在文章的开始,先祝大家牢大年快乐


C语言中的类型转换

在C语言中,如果赋值运算两边类型不同,则会发生类型转换。一般来说,C语言有两种形式的类型转换:隐式转换和显式转换。

隐式转换,就是编译器自动根据其类型,将其转换成另一个适合赋值的恰当类型。
显式转换,则是需要咱手动写出应该转换成哪一种类型,然后根据指定的类型强制转换。

但是,这些转换都是编译器最底层在做的事情,就算我们通过调试,也难以发现编译器到底做了什么样的转换,转换成了什么类型,具体的值是多少,程序出错也无从查起。所以,C++中诞生了四种新的类型转换:

  • static_cast 静态转换
  • reinterpret_cast 由高向低的转换
  • const_cast 删除const转换
  • dynamic_cast  父子转换

C++中的类型转换

static_cast

static_cast,静态转换。看名字很不好理解其作用是什么,但是其功能很简单——所有编译器进行的隐式类型转换,都叫做static_cast。比如从int转换成double,从地址转换成int,这些不需要我们特意去写出转换类型的,都直接用static_cast,让编译器去自动转换。

int main()
{int i = 1;double d = static_cast<int>(i);//这里自动将i的值转换成了对应double的值,然后传递给dcout << d << endl;
}

reinterpret_cast

reinterpret_cast,重新解释的转换。我们都知道,double相对于int,是精度更高的数据类型,int转换成double是从低向高的转换。但是如果double转换成int,则是从高向低的转换,此时便需要用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,常属性转换。但是他的目的可不是将变量赋值为常属性,而是删除变量的常属性。 

比如以下程序

int main()
{const int a = 2;int& p = a;//在此报错p = 3;
}

正常来说,如果我们对一个const进行非const引用,属于权限的放大,程序会报错。但是,我们可以通过const_cast来删除他的const属性。

int main()
{const int a = 2;int& p = const_cast<int&>(a);//const_cast必须传入指针或者引用p = 3;
}

此时便可以正常引用,且可以通过p修改a的值。但是只有p的值才可以修改,a仍是const无法修改!

但是,当我们分别输出a和p的值时,会发现一个神奇的事情:

 而在const int a前加上关键字volatile,输出结果又一样了

volatile

正常情况下,如果一个值已经被赋予了const属性,编译器在访问其值的时候,便不会访问其具体地址上的内存,而是会事先用一块空间专门存这些常量,等到访问的时候直接输出常量。因此,编译器并不会考虑还会出现const也会被修改的情况。而volatile,不稳定的,表示这个const并不是稳定的,强制编译器每一次都要去访问内存来调用那里的值。

dynamic_cast

dynamic_cast,动态转换,用于将父类对象转化为子类对象。

我们都知道,子类对象可以直接赋值给父类对象,原理是切片,就是直接将一块空间切给父类。但是如果父类对象赋值给子类对象,那就会导致内存越界访问的问题。

dynamic_cast,便是当父类赋值给子类的时候,会另外开辟一个空间,然后用父类的元素去构造一个新的子类对象,再进行赋值。


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

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

相关文章

YOLOv8改进 | 主干篇 | EfficientNetV2均衡缩放网络改进特征提取层

一、本文介绍 这次给大家带来的改进机制是EfficientNetV2,其在其V1版本通过均衡地缩放网络的深度、宽度和分辨率,以提高卷积神经网络的性能的基础上,又提出了一种改进的渐进式学习方法,通过在训练过程中逐步增加图像尺寸并适应性调整正则化来加快训练速度,同时保持准确性…

小白入门基础 - spring Boot 入门

1.简介 spring Boot是为了简化java的开发流程而构建的&#xff0c;即使是使用springMVC框架&#xff0c;也依然需要大量配置和依赖导入&#xff0c; 这无疑是繁琐的&#xff0c;spring Boot采用了”习惯由于配置“的原则&#xff0c;进行一键化部署&#xff0c;这样极大…

214.【2023年华为OD机试真题(C卷)】测试用例执行计划(排序题-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-测试用例执行计划二.解题思路三.题解代码Pytho…

Java解决峰与谷问题

Java解决峰与谷问题 01 题目 在一个整数数组中&#xff0c;“峰”是大于或等于相邻整数的元素&#xff0c;相应地&#xff0c;“谷”是小于或等于相邻整数的元素。例如&#xff0c;在数组{5, 8, 4, 2, 3, 4, 6}中&#xff0c;{8, 6}是峰&#xff0c; {5, 2}是谷。现在给定一个…

三英战吕布web3游戏项目启动全流程

项目是一个学习相关的很好的例子并且开源&#xff0c;原本的项目是连接goerli网络&#xff0c;但我把它修改为可连接ganache网络的项目了&#xff0c;更方便启动。 智能合约部分 进入文件 hardhat.config.js &#xff0c;增加一个钱包私钥 2.执行npm install 3.测试合约 npx ha…

【Linux】linux配置静态IP、动态IP方法汇总

1、systemd-networkd 1.1 说明 systemd-networkd是systemd 的一部分 ,负责 systemd 生态中的网络配置部分(systemd-networkd.service, systemd-resolved.service)。使用 systemd-networkd,你可以为网络设备配置基础的 DHCP/静态IP网络等,还可以配置虚拟网络功能,例如网桥…

在pycharm中jupyter连接上了以后显示无此库,但是确实已经安装好了某个库,使用python可以跑,但是使用ipython就跑不了

今天遇到一个事情&#xff0c;就是用pycharm的jupyter时&#xff0c;连接不上&#xff0c;后来手动连接上了以后&#xff0c;发现环境好像不对。 一般来说&#xff0c;这里会是python3&#xff0c;所以里面的环境也是普通python的环境&#xff0c;并没有我下载的库&#xff0c;…

金和OA C6 SAP_B1Config.aspx 未授权漏洞

产品介绍 金和网络是专业信息化服务商,为城市监管部门提供了互联网监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 漏洞描述 金和OA C6 SAP_B1Config.aspx接口 未授权&#xff0c;攻击者可通过此漏洞获取数据库账户密码等敏…

2015年电赛控制类—STM32风力摆控制系统资料+源程序

目录 一、项目背景 二、主要研究内容 三、总体思路与研究方案 四、主要研究结果 五、程序 六、图片 一、项目背景 风力摆控制系统是一种利用风力控制物体做简谐运动的系统&#xff0c;风力的利用和控制技术在我国的发展尚未完善&#xff0c;国内正处于起步阶段。风力摆的…

idea设置注释在鼠标当前位置,使其不从顶格位置添加注释

idea设置注释在鼠标当前位置&#xff0c;使其不从顶格位置添加注释 默认情况下&#xff0c;注释都是从改行的顶格开始&#xff0c;看起来不太美观而且不易清除分级 设置让其从代码处开始&#xff0c;步骤&#xff1a;File–>Sttings–>Editor–>Code Style &#xff…

Mysq之——分库分表

Mysq之——分库分表 简介分库分表的方式垂直分表垂直分库水平分库水平分表 图解&#xff1a;垂直分表与水平分表&#xff08;分库类似&#xff09;分库分表带来的问题 简介 分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题&#xff0c;将原来独立的数据库拆分成…

[英语学习][24][Word Power Made Easy]的精读与翻译优化

[序言] 译者的这次翻译, 中规中矩, 就是遗漏了2个单词没有翻译出来 [英文学习的目标] 提升自身的英语水平, 对日后编程技能的提升有很大帮助. 希望大家这次能学到东西, 同时加入我的社区讨论与交流英语相关的内容. [原著英文与翻译版对照][第22页] This book is designed…

IMS SIP register消息中的Contact header field

SIP register中的Contact还要承载User Agent的能力信息。 实网下抓取的UE log如上&#xff0c;下面就主要看下Contact header field要包含的内容及其含义。 Contact header field设置为包括 UE IP地址或FQDN的SIP URI。 如上图contact中sip:69a5de6a-a03e-46d6-ad7a-b0d974c8f…

【Synopsys工具使用】2.Verdi的使用

文章目录 用VCS生成波形文件并用Verdi打开生成fsdb文件使用Verdi查看逻辑原理图 用VCS生成波形文件并用Verdi打开 编写Makefile文件&#xff1a; all:find com find:find -name "*.v" > file.list com: …

怎么快速筛选查看postfix的邮件记录

现状 通过分析日志获取记录 1.多个收件人时&#xff0c;日志有多行&#xff0c;而且不宜读 2.日志中默认没有邮件主题信息 3.日志中默认没有年的信息 解决办法 小编今天发现了一个不错的开源小命令&#xff0c;查看和下载请点击&#xff1a;postfixlogparse 直接下载下来…

计算机Java项目|Springboot疫情网课管理系统

项目编号&#xff1a;L-BS-ZXBS-07 一&#xff0c;环境介绍 语言环境&#xff1a;Java: jdk1.8 数据库&#xff1a;Mysql: mysql5.7 应用服务器&#xff1a;Tomcat: tomcat8.5.31 开发工具&#xff1a;IDEA或eclipse 二&#xff0c;项目简介 疫情网课也都将通过计算机…

【鸿蒙4.0】harmonyos Day 01

一. 初次使用鸿蒙原生编译器Dev Ecostudio创建一个新工程&#xff08;项目&#xff09;&#xff0c;控制台报错&#xff1a;ohpm ERROR: NOTFOUND package "ohos/hypium" not found from all the registries https://repo.harmonyos 这个错误应该是一些配置没下载成…

python小技巧

使用列表解析式&#xff08;List Comprehension&#xff09;快速创建列表&#xff0c;例如&#xff1a;[x for x in range(10)] 使用enumerate()函数遍历列表时获取索引和值&#xff0c;例如&#xff1a; for i, value in enumerate(my_list): print(i, value) 使用zip()函数…

2 万字详解,吃透 ES!

生活中的数据 搜索引擎是对数据的检索&#xff0c;所以我们先从生活中的数据说起。 我们生活中的数据总体分为两种&#xff1a;结构化数据 和 非结构化数据 。 结构化数据 &#xff1a;也称作行数据&#xff0c;是由二维表结构来逻辑表达和实现的数据&#xff0c;严格地遵循…

年少不懂宋公明,读懂已是中年人

及时雨宋江及时的不是雨&#xff0c;而是银子。 年轻的时候&#xff0c;以为聚义厅聚的是义&#xff0c;中年以后才看明白&#xff0c;聚义厅聚的是利。 利益是纽带&#xff0c;是动力。 懂得从他人利益的角度出发&#xff0c;我们才能调动更多的人和资源&#xff0c;成就一…