learn C++ NO.31——类型转换

news2024/11/26 16:45:41

C语言中的类型转换

在C语言中,当赋值符号两边的类型不匹配的时候,或者是形参类型和实参类型不匹配时,返回值类型与接受返回值类型不匹配时,都会需要类型转换。C语言的类型转换有两种:显示类型转换隐式类型转换

显示类型转换通常是由程序员自己指定转换的类型。而隐式类型转换是编译器在编译期间进行推导,如果符合转换条件就自动转换,否则就报错处理。通常内置类型的浮点数类型或者整型类型的变量支持隐式类型的转换。
在这里插入图片描述
隐式类型转换的代码的可读性较差,并且如果类型转换都是通过这一种形式来写,定位转换错误的成本较高。隐式类型转换可能会导致数据丢失或产生未定义行为,从而影响程序的安全性和正确性。特别是在进行数据截断或符号位改变的转换时,可能会得到意想不到的结果。

下面通过一个经典的隐式类型导致程序错误的样例,带大家看看隐式类型转换的坑。
在这里插入图片描述
end是一个整型变量,但是它和无符号整型变量pos比较时,会隐式类型转换成无符号整型。所以导致了程序死循环问题,因为无符号整型不可能为负数。这类场景在我刚学线性表的时候坑了我。解决方法也很简单,可以控制一下end的位置,并修改一下判断条件为 > 即可。当然,使用强制类型转化将比较逻辑的pos转化成int也可以。

下面再来看看一个比较特别的场景
在这里插入图片描述
通过代码可以看到,n指向的空间已经被我们修改了。为什么打印n还是10呢?因为编译器对于const修饰的变量进行了一个特殊的优化。不同编译器的优化可能不同,有的编译器把n存到寄存器中。而有的编译器会进行写成宏,在编译时进行宏替换。所以,n就还是10。而n的地址上的值已经被改成11了。
在这里插入图片描述

为了避免编译器对具有常属性的变量所做的特殊处理,可以是用volatile关键字要求编译器每一次都去内存中获取值。
在这里插入图片描述

C++的强制类型转换

单参数的构造支持隐式类型的转换。使用explicit关键字修饰构造函数可以禁止隐式类型转换。
在这里插入图片描述

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:static_cast、reinterpret_cast、const_cast以及dynamic_cast。描述代码类型转换后,可以大幅度提高代码的可读性,以及对一些类型错误处理更加方便。

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

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

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

在这里插入图片描述

dynamic_cast用于将一个父类的指针或引用赋值给子类对象的指针或引用时进行安全的动态转换。首先我们需要知道,子类的的指针或引用赋值给复类对象的指针或引用成为向上赋值。这个是编译器支持的,这个行为称之为切片或者切割。但是,父类的指针或引用赋值给子类对象的指针或引用是一个向下赋值。这样的行为是很危险的。
在这里插入图片描述

虽然,向下赋值编译器不会报错。但是由于A的值赋值给B*,但是A里面没有第二个成员。这是越界访问,会导致程序崩溃。

在这里插入图片描述
而dynamic_cast可以避免这一情况,当向下赋值时,dynamic_cast会让被修饰的对象的值为空。这样就避免了可能存在的越界访问情况。下面就通过一个简单程序验证一下。
在这里插入图片描述
至于dynamic_cast为什么需要父类提供虚函数?是因为dynamic_cast底层可能是通过标记虚函数表里的虚函数来区分父类和子类的。所以,才能做到区分向上赋值和向下赋值。

使用强制转换之前应该多想一想是否还有别的方式解决。如果能避免使用强制类型转换就应该避免用强制类型转换。这样可以减少强制类型转换潜在的错误。

C++标准提供四个强制类型转换也是希望大家在开发时,能够规范的进行类型转换。这样能够提高代码的可读性和可维护性。实践中,大家按照具体规章制度来即可。

RTTI

RTTI 是 C++ 语言的一个特性,它允许程序在运行时获取对象的类型信息。这种类型信息包括对象的实际类型(比如是某个基类的派生类具体哪一种),以及对象与其他类型之间的关系(如继承关系)。通过 RTTI,程序能够在运行阶段做出基于类型的决策,这在一些复杂的面向对象编程场景中非常有用。

RTTI的操作方式有如下,typeId、 decltype以及dynamic_cast。

RTTI涉及到的一些底层机制有虚函数表以及type_info类。

RTTI的应用

插件系统:在插件系统的开发中,主程序可能需要加载不同类型的插件。这些插件可能是从一个公共基类派生出来的。通过 RTTI,主程序可以在运行时识别插件的具体类型,从而正确地调用插件的功能。例如,一个图形编辑软件可能有多种形状的插件(如圆形插件、矩形插件等),这些插件都继承自一个Shape基类。当软件加载插件时,利用dynamic_cast可以确定插件是哪种具体的形状,进而调用相应的绘制方法。

对象序列化和反序列化:在对象序列化(将对象转换为字节流以便存储或传输)和反序列化(将字节流转换回对象)的过程中,RTTI 可以帮助确定对象的类型。这样可以确保正确地重建对象,尤其是当存在继承关系的对象需要被处理时。例如,一个复杂的游戏存档系统,可能需要对游戏中的各种角色(不同角色类可能有继承关系)进行序列化和反序列化,RTTI 可以用于在反序列化时确定每个角色对象的具体类型。

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

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

相关文章

基于Spring Boot的养老保险管理系统的设计与实现,LW+源码+讲解

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统养老保险管理系统信息管理难度大,容错率低&a…

w029基于springboot的网上购物商城系统研发

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文件&#xff0…

Unet++改进8:添加SpatialGroupEnhance||空间群智能增强:改进卷积网络中的语义特征学习

本文内容:添加SpatialGroupEnhance 论文简介 卷积神经网络(Convolutional Neural Networks, cnn)通过收集分层的、不同部分的语义子特征来生成复杂对象的特征表示。这些子特征通常以分组的形式分布在每一层的特征向量中[43,32],代表各种语义实体。然而,这些子特征的激活往往…

十八:Spring Boot 依赖(3)-- spring-boot-starter-data-jpa 依赖详解

目录 1. 理解 JPA(Java Persistence API) 1.1 什么是 JPA? 1.2 JPA 与 Hibernate 的关系 1.3 JPA 的基本注解:Entity, Table, Id, GeneratedValue 1.4 JPA 与数据库表的映射 2. Spring Data JPA 概述 2.1 什么是 Spring Dat…

MQTT协议解析 : 物联网领域的最佳选择

1. MQTT协议概述 1.1 MQTT协议是什么 MQTT : Message Queuing Telemetry Transport 模式 : 发布 / 订阅主题优点 : 代码量小、低带宽、实时可靠应用 : 物联网、小型设备、移动应用MQTT 常用端口 : 1883 MQTT是一个网络协议,和HTTP类似,因为轻量简单&…

Pytorch实现transformer语言模型

转载自&#xff1a;| 03_language_model/02_Transformer语言模型.ipynb | 从头训练Transformer语言模型 |Open In Colab | Transformer语言模型 本节训练一个 sequence-to-sequence 模型&#xff0c;使用pytorch的 nn.Transformer <https://pytorch.org/docs/master/nn.ht…

ElasticSearch向量检索技术方案介绍

1、背景 在人工智能快速发展的今天&#xff0c;推荐技术、以文搜图、以文搜视频、以图搜图等技术已经得到了广泛的应用&#xff0c;在百度、小红书、抖音、快手等app上随便输入一段文本&#xff0c;搜索结果已不像早些年那么单一&#xff1a;只有一些文字信息&#xff0c;现在的…

算法(第一周)

一周周五&#xff0c;总结一下本周的算法学习&#xff0c;从本周开始重新学习许久未见的算法&#xff0c;当然不同于大一时使用的 C 语言以及做过的简单题&#xff0c;现在是每天一题 C 和 JavaScript&#xff08;还在学&#xff0c;目前只写了一题&#xff09; 题单是代码随想…

华为云镜像仓库基本操作

1. 登陆华为云账户,在搜索框输入"镜像容器",如下图所示: 单击 输入名称后单击确定 创建成功 2. 回到这里 单击这里 获得登陆指令 复制到你的云服务器粘贴,回车后提示"Login Succeeded"表示登陆成功. 3. 还是在"总览"这里,单击这里 跟着复制操作…

【1个月速成Java】基于Android平台开发个人记账app学习日记——第10天,登录状态保持与退出登录

系列专栏链接如下&#xff0c;方便跟进&#xff1a; https://blog.csdn.net/weixin_62588253/category_12821860.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12821860&sharereferPC&sharesourceweixin_62588253&sharefromfrom_linkhttps://b…

MySQL系列之如何在Linux只安装客户端

导览 前言Q&#xff1a;如何安装一个Linux环境下的MySQL客户端一、准备文件1. 确认Server版本2. 选择Client安装文件 二、下载并安装1. 下载1.1 寻找文件1.2 文件说明 2. 安装2.1 上传至Linux服务器2.2 执行安装 三、连接验证1. 确认远程授权2. 建立远程连接 结语精彩回放 前言…

arcgis pro 学习笔记

二维三维集合在一起&#xff0c;与arcgis不同 一、首次使用&#xff0c;几个基本设置 1.选项——常规里面设置自动保存时间 2.新建工程文件&#xff0c;会自动加载地图&#xff0c;可以在选项里面设置为无&#xff0c;以提高启动效率。 3.设置缓存位置&#xff0c;可勾选每次…

【论文复现】MSA+抑郁症模型总结(三)

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀MSA抑郁症模型 热门研究领域&#xff1a;情感计算的横向发展1. 概述2. 论文地址3. 研究背景4. 主要贡献5. 模型结构和代码6. 数据集介绍7. 性…

‌STAR法则

一&#xff1a;STAR法则 STAR法则是一种简单而实用的表现技巧&#xff0c;常被用于求职过程中的个人经历描述&#xff0c;富有条理性&#xff0c;可以帮助你在职场中脱颖而出。“STAR”分别对应的是situation-task-action-result&#xff0c;通过情境、目标、行动和结果四个方面…

java:使用Multi-Release Jar改造Java 1.7项目增加module-info.class以全面合规Java 9模块化规范

common-java是一个我维护了好多年的一个基础项目,编译目标为Java 1.7 现在整个团队的项目要做Java 9以上的技术迁移准备,就需要对这个在内部各项目中被广泛引用的基础项目进行改造,以适合Java 9的模块化规范。 Automatic-Module-Name Java 9的模块化规范(即Java Platform Mod…

力扣题库——75.颜色分类

这道题采用三路快速排序&#xff0c;快速排序思路看这里快速排序。将数列分为三组&#xff1a;小于基准、等于基准、大于基准。和快排一样&#xff0c;对左右递归进行快速排序。 先将题目简化&#xff0c;如果只有数字0和1&#xff0c;扫描一遍数组&#xff0c;遇到数字1不用管…

python - leetcode【数据结构-算法】-入门/通关手册

python的算法入门/通关/手册 前言&#xff1a;算法通关手册&#xff08;LeetCode&#xff09;-githubHello 算法&#xff1a;python数据结构和算法 - 中文版The Algorithms - Python最后刷题思维: python-leetcode刷题常用语法&#xff1a;变量定义&#xff1a;逻辑与或非和按位…

使用 Flask 和 ONLYOFFICE 实现文档在线编辑功能

提示&#xff1a;CSDN 博主测评ONLYOFFICE 文章目录 引言技术栈环境准备安装 ONLYOFFICE 文档服务器获取 API 密钥安装 Flask 和 Requests 创建 Flask 应用项目结构编写 app.py创建模板 templates/index.html 运行应用功能详解文档上传生成编辑器 URL显示编辑器回调处理 安全性…

EasyUI弹出框行编辑,通过下拉框实现内容联动

EasyUI弹出框行编辑&#xff0c;通过下拉框实现内容联动 需求 实现用户支付方式配置&#xff0c;当弹出框加载出来的时候&#xff0c;显示用户现有的支付方式&#xff0c;datagrid的第一列为conbobox,下来选择之后实现后面的数据直接填充&#xff1b; 点击新增&#xff1a;新…

C# 选择导入文件的路径、导出文件的路径

通过C#代码&#xff0c;调出windows风格的文件选择对话框和存储文件对话框。提供界面来选择文件的位置&#xff0c;并将完整路径以字符串形式返回。 1、选择导入文件&#xff0c;获取其路径 C#通过这段代码将弹出一个文件选择对话框&#xff0c;允许用户选择一个文件&#xff…