c++ - 第23节 - C++的类型转换

news2025/5/31 22:08:08

1.C语言中的类型转换

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

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


2.为什么C++需要四种类型转换

C风格的转换格式很简单,但是有不少缺点的:
1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
2. 显式类型转换将所有情况混合在一起,代码不够清晰
因此C++提出了自己的类型转化风格。
注:因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。


3.C++强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast
注:虽然c++中还可以使用C语言的转化风格,但是建议使用上面c++的规范去转换,可读性会提升,出错的概率会降低。

3.1.static_cast

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

3.2.reinterpret_cast

功能:reinterpret_cast用于不相关类型之间的类型转换。
详细介绍:reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。

3.3.const_cast

功能:去掉对象const属性的类型转换。
详细介绍:const_cast最常用的用途就是删除变量的const属性,方便赋值。

注:

1.这里打印2和3的原因是编译器的优化。
编译器优化方式一:遇见代码const int a = 2,const类型的变量编译器会在内存中存储一份,在寄存器中存储一份,取地址取的是内存地址,因此后面修改时修改的是内存中的a变量值,寄存器中的a变量值不变,打印时打印的是寄存器中的a变量值。
编译器优化方式二:在预处理阶段,编译器遇到cout << a << endl打印const类型的变量a时直接替换成cout << 2 << endl。
vs编译器使用的是第二种优化方式。
2.关键字volatile的功能是每次访问volatile修饰的变量时都去内存中去取,防止编译器的优化。这里给代码const int a = 2的前面加一个关键字volatile,打印出来的结果就是3和3,如下图所示。

3.4.dynamic_cast

功能:规范向下转换,转换是安全的。
详细介绍:dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)。如果本身父类对象的指针/引用指向的是子类对象,则dynamic_cast转换成功,返回指针/引用;如果本身父类对象的指针/引用指向的是父类对象,那么如果成功转换则转换成子类对象的指针/引用指向原本的父类对象,使用子类对象的指针/引用访问的话就会越界访问,如下图所示,因此dynamic_cast转换失败,返回空指针/整数零。
向上转换:子类对象指针/引用->父类指针/引用(不需要转换,天然支持,赋值兼容规则)
向下转换:父类对象指针/引用->子类指针/引用(用dynamic_cast转换是安全的)

注:

1.向上转换无论是子类对象、指针还是引用都支持;向下转换只有指针和引用支持,对象不支持。

2.dynamic_cast是规范向下转换,转换是安全的,安全的意思就是能转换成功才会转,转换失败即不是指向子类对象那么就不转。
3.由于底层原因dynamic_cast只能用于父类含有虚函数的类(含有虚函数的父类也叫多态类,因此也可以说dynamic_cast只能用于父类是多态类的情况)。如果父类没有虚函数但还是要转可以使用reinterpret_cast,但reinterpret_cast不保证转换是安全的。
注意:
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。
强烈建议:避免使用强制类型转换。


4.RTTI(了解)

RTTI:Run-time Type identification的简称,即:运行时类型识别。
C++通过以下方式来支持RTTI:
1. typeid运算符
2. dynamic_cast运算符
3. decltype

5.常见面试题

1. C++中的4中类型转化分别是:_________、_________、_________、_________
2. 说说4中类型转化的应用场景。

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

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

相关文章

业务安全情报 | 数十万元的数据报告,竟被50元批量转售

近期监测到某咨询公司针数据报告大量泄漏事件&#xff0c;该机构历年的数据报告以及近期更新的针对VIP会员的付费报告均在电商等渠道可以低价获取。 BSL-2022-a3c28号情报文件显示黑灰产通过作弊方式获取查看、下载权限&#xff0c;绕过限制将报告数据大量下载&#xff0c;并通…

javaEE初阶 — 认识文件

文章目录认识文件1. 树型结构组织和目录2. 文件路径&#xff08;Path&#xff09;2.1 绝对路径2.2 相对路径3. 文件的类型认识文件 文件分为 狭义 和 广义 两种 狭义的文件&#xff1a;指的是硬盘上的 文件 和 目录 广义的文件&#xff1a; 泛指计算机中很多的软硬件资源。操…

2022(一等奖)D926刘家峡库区潜在滑坡InSAR识别与分析

作品介绍 1 应用背景 滑坡是普遍存在于世界各地山区的主要灾害之一&#xff0c;严重威胁着人类的生命财产安全和自然环境。滑坡不但会直接破坏人类生命财产安全和建筑物&#xff0c;而且还会造成堰塞湖等次生灾害&#xff0c;进而对人类的生命财产安全和基础设施等造成二次破坏…

暴力破解 SSH

Kali 的 MSF 终端&#xff0c;对渗透目标主机 的 SSH 服务进行暴力破解。 破解的是否成功取决于字典和目标是否使用弱密码。 一&#xff0c;实验环境 分别是攻击机和靶机&#xff08;也可是其他目标服务器&#xff09; 二、利用 SSH 弱密码进行暴力破解 暴力破解最重要的要…

100 道 Linux 笔试题,能拿 80 分就算大神!

本套笔试题共100题&#xff0c;每题1分&#xff0c;共100分。&#xff08;参考答案在文章末尾&#xff09; 1.cron 后台常驻程序 (daemon) 用于&#xff1a; A. 负责文件在网络中的共享 B. 管理打印子系统 C. 跟踪管理系统信息和错误 D. 管理系统日常任务的调度 2.在大多数Li…

如何使用无标签数据进行预训练?

一、直观解释 简单来说就是“造目标”。也即人为地去构造一些子任务&#xff08;论文里的protext task&#xff09;&#xff0c;或者利用一些最基本的公理性常识&#xff0c;去设计“类似监督”的任务。所不同的是&#xff0c;我们引入的“类似监督”的任务通常是用来完成表征…

day13|559.n叉树的最大深度、222.完全二叉树的节点个数

559.n叉树的最大深度 给定一个 N 叉树&#xff0c;找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示&#xff0c;每组子节点由空值分隔&#xff08;请参见示例&#xff09;。 示例 1&#xff1a; 输入&#xff1a;r…

基于opencv的图像:边缘检测 (完整代码+详细教程)

给出“离散拉普拉斯算子”一般形式的数学推导 离散值的导数使用差分代替: 所以: 以(x, y)为中心点,在水平和垂直方向上应用拉普拉斯算子,滤波器(对应a=1的情况)为:

广告归因-让你彻底弄归因架构实现

这里会引用神策数据很多的介绍&#xff0c;然后进行总结 归因方法 自归因 渠道商帮我们做归因&#xff0c;有的是每个用户打开 app 都回传给渠道商&#xff0c;渠道商自己归因有的如华为是从应用商店安装时&#xff0c;应用商店把归因信息写入到 app, 然后首次安装启动时能从本…

【信息学CSP-J近16年历年真题64题】真题练习与解析 第12题之加工零件

加工零件 描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有 𝑛 位工人,工人们从 1~𝑛编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带。 如果 𝑥 号工人想生产一个被加工到第 𝐿(…

回溯法--旅行售货员问题--排列树

回溯法有点类似于暴力枚举的搜索过程&#xff0c;回溯法的基本思想是按照深度优先搜索的策略&#xff0c;从根节点出发深度搜索解空间树&#xff0c;当搜索到某一节点时&#xff0c;如果该节点可能包含问题的解&#xff0c;则继续向下搜索&#xff1b;反之回溯到其祖先节点&…

【学习笔记】【Pytorch】六、nn.Module的使用

【学习笔记】【Pytorch】六、nn.Module的使用学习地址主要内容一、torch.nn模块概述二、nn.Module类的使用1.使用说明2.代码实现学习地址 PyTorch深度学习快速入门教程【小土堆】. 主要内容 一、torch.nn模块概述 概述&#xff1a;帮助程序员方便执行与神经网络相关的行为。…

微信小程序——WXSS模板样式,rpx,样式导入,全局样式和局部样式,全局配置-window

一.WXSS模板样式1.什么是 wxss WXSS ( WeiXin Style Sheets &#xff09;是一套样式语言&#xff0c;用于美化 WXML 的组件样式&#xff0c;类似于网页开发中的CSS。2. WXSS 和 CSS 的关系WXSS 具有 CSS 大部分特性&#xff0c;同时&#xff0c; WXSS 还对 CSS 进行了扩充以及修…

73. 风格迁移以及代码实现

摄影爱好者也许接触过滤波器。它能改变照片的颜色风格&#xff0c;从而使风景照更加锐利或者令人像更加美白。但一个滤波器通常只能改变照片的某个方面。如果要照片达到理想中的风格&#xff0c;可能需要尝试大量不同的组合。这个过程的复杂程度不亚于模型调参。 本节将介绍如…

数据导入导出(POI以及easyExcel)

一.概念&#xff1a; 1.场景需求 将一些数据库信息导出为Excel表格 将Excel表格数据导入数据库 大量数据的导入导出操作 常⽤的解决⽅案为&#xff1a;Apache POI与阿⾥巴巴easyExcel2.Apache POI介绍 Apache POI 是基于Office Open XML 标准&#xff08;OOXML&#xff09;和M…

96、【树与二叉树】leetcode ——404. 左叶子之和:递归法[先序+后序]+迭代法[先序+层次](C++版本)

题目描述 原题链接&#xff1a;404. 左叶子之和 解题思路 一、递归法 &#xff08;1&#xff09;设置一个布尔变量判定&#xff08;先序遍历&#xff09; 左孩子一定在每个子树的最左侧&#xff0c;因此设置一个局部参数flag&#xff0c;当每次遍历的是左子树时&#xff0c…

记录一次Oracle Linux7上安装RDBMS 11.2.0.4的问题

参考文档&#xff1a; 文档1 OHASD fails to start on SuSE 11 SP2 on IBM: Linux on System z (Doc ID 1476511.1) As part of the root.sh, roothas.pl or rootcrs.pl is called and an entry is placed in /etc/inittab h1:35:respawn:/etc/init.d/init.ohasd run >/de…

cmake入门之二:调用外部共享库和头文件

cmake入门之二&#xff1a;调用外部共享库和头文件1.创建外部共享库1.1 创建相关文件或文件夹1.1.1 ext目录下的CMakeLists.txt1.1.2 ext目录lib文件夹下1.1.2.1 hello.h1.1.2.2 hello.c1.1.2.3 CMakeLists.txt1.2 编译、安装2.创建当前项目2.1 创建相关文件或文件夹2.1.1 proj…

为什么这么努力,还是赚不到钱?你不能不知道赚钱的三个模型

大部分人赚钱&#xff0c;都是通过能力努力运气&#xff0c;这种需要付出自己的大量时间和精力&#xff0c;并且赚到的钱也是有上限的。小部分人赚钱是通过&#xff0c;个人IP的商业模式来赚钱&#xff0c;并且跟我们传统的生意不一样的是&#xff0c;这个亏钱是有下限的&#…

OpenHarmony轻量级设备xts认证大致流程

因为最近公司在做openharmony开发板xts认证&#xff0c;这里对认证过程和过程中遇到的坑做下记录&#xff0c;也给大家探探路。 1. 开发板适配 OpenHarmony轻量系统的移植比较简单&#xff0c;代码中解耦做得非常好。从代码的设计理念上来看&#xff0c;移植主要是3部分的内容…