当前位置: 首页 > news >正文

基于C语言中的类型转换,C++标准创造出了更加可视化的类型转换

目录

前言

一、 C语言中的类型转换

二、为什么C++需要四种类型转换

 三、C++中新增的四种强制类型转换操作符以及它们的应用场景

1.static_cast

2.reinterpret_cast

3.const_cast

4.dynamic_cast


前言

在C语言中,如果赋值运算符左右两侧的类型不同,或者形参与实参类型不同,或者返回值类型与接收返回值类型不同,这几种情况都会发生类型转换。但是C语言的类型转换是由缺陷的,比如:转换的可视性比较差,转换书写的形式单一没有对类型之间的转换进行区别。基于以上原因,C++增添了四种强制类型转换操作符,目的是为了增加类型转换的可视化性。

首先我们先来看一下C语言中的类型转换。

一、 C语言中的类型转换

C语言中的类型转换有两种:隐式类型转换  显示类型转换。

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

d3277e1ba0944b19a071e1a5c636d93c.png 

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

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

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

 

 三、C++中新增的四种强制类型转换操作符以及它们的应用场景

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

1.static_cast

static_cast用于非多态类型的转换(静态转换), 编译器隐式执行的任何类型转换 都可用 static_cast 但它不能用于两个不相关的类型进行转换(只可以对意义相近的类型转换)。
void Test()
{
double d = 9.8;
int i = static_cast<int>(d);
cout << i << endl;
}

2.reinterpret_cast

reinterpret_cast 用于意义不相似但是有关联的类型(比如int和int*  int和char)。
void Test()
{
int i = 9;
int* p = reinterpret_cast<int*>(i);
i = reinterpret_cast<int>(p);
cout << (void*)p << endl;
cout << i << endl;
}

 458624164981466e8f513427de5cdf61.png

3.const_cast

const_cast 最常用的用途就是删除变量的const属性,方便赋值
void Test()
{
const int i = 7;
int* p = const_cast<int*>(&i);
*p = 9;
cout << &i << endl;
cout << p << endl;
cout << i << endl;
cout << *p << endl;
}

11aa4ad791214e888ae861ee1abc6e66.png

上面运行结果i打印出来为什么仍然是7而不是9呢?这是因为:

const修饰的变量编译器通常对其进行优化,系统取变量i的值时其实是不在内存中读取的,而是在寄存器中读取,或者是系统直接取常量7的值而不通过内存来读取i的值。

如果要想让系统在内存中读取被const修饰的变量的值,在const前加上关键字volatile即可。加上关键字volatile后的运行结果如下:

94421c81cebf468abd111890e01ad7be.png

4.dynamic_cast

dynamic_cast 的功能如下:
向上转型:子类对象指针 / 引用 -> 父类对象指针 / 引用 ,子类对象->父类对象也可以( 不需要类型转换,赋值兼容规则 )
向下转型:父类对象指针 / 引用 -> 子类对象指针 / 引用,父类对象->子类对象不可以(用 dynamic_cast 转型是安全的 )
注意:
dynamic_cast 只能用于父类 含有虚函数的类
dynamic_cast 会先检查是否能转换成功,能成功则转换,不能则返回NULL
96da0ffd9d114f6d98b00befe8a575e9.png

 

 

 

相关文章:

基于C语言中的类型转换,C++标准创造出了更加可视化的类型转换

目录 前言 一、 C语言中的类型转换 二、为什么C需要四种类型转换 三、C中新增的四种强制类型转换操作符以及它们的应用场景 1.static_cast 2.reinterpret_cast 3.const_cast 4.dynamic_cast 前言 在C语言中&#xff0c;如果赋值运算符左右两侧的类型不同&#xff0c;或者…...

如何创建族表

https://jingyan.baidu.com/article/c275f6bafa5714a23c756768.html...

【UnityRPG游戏制作】Unity_RPG项目_PureMVC框架应用

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

并行计算的一些知识点分享--并行系统,并行程序, 并发,并行,分布式

并行计算 核是个啥&#xff1f; 在并行计算中&#xff0c;“核”通常指的是处理器的核心&#xff08;CPU核心&#xff09;。每个核心都是一个独立的处理单元&#xff0c;能够执行计算任务。多核处理器指的是拥有多个这样核心的单一物理处理器&#xff0c;这样的设计可以允许多…...

设计模式:访问者模式

访问者模式&#xff08;Visitor Pattern&#xff09;是行为设计模式的一种&#xff0c;它使你能够在不修改对象结构的情况下&#xff0c;给对象结构中的每个元素添加新的功能。访问者模式将数据结构和作用于结构上的操作解耦&#xff0c;使得操作集合可相对自由地演化。 核心概…...

vivado Virtex-7 配置存储器器件

Virtex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Virtex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…...

检测服务器环境,实现快速部署。适用于CRMEB_PRO/多店

运行效果如图&#xff1a; 最近被好多人问&#xff0c;本来运行的好好的&#xff0c;突然swoole就启动不了了。 本工具为爱发电&#xff0c;如果工具正好解决了您的需求。我会很开心 代码如下&#xff1a; """本脚本为爱发电by:网前雨刮器 """…...

Spring Security初探

url说明方法/login/oauth/authorize授权断点。无登录态时跳转到/authentication/require&#xff0c;有登录态时跳转到/loginorg.springframework.security.oauth2.provider.endpoint.AuthorizationEndpoint#authorize/authentication/require自己写的用于重定向到登录页面的ur…...

【Java代码审计】敏感信息泄漏篇

【Java代码审计】敏感信息泄漏篇 敏感信息泄露概述 敏感信息泄露概述 敏感信息是业务系统中对保密性要求较高的数据&#xff0c;通常包括系统敏感信息以及应用敏感信息 系统敏感信息指的是业务系统本身的基础环境信息&#xff0c;例如系统信息、中间件版本、代码信息&#xff…...

Windows Server 2012 R2 新增D盘分区

我们经常搭建windows版本的游戏时会要在D盘上操作&#xff0c;今天就介绍下新的服务器如何新增一个D盘。 在"开始"图标右边有个”服务器管理器“&#xff0c;单击点开 点开服务器管理器后&#xff0c;点击“工具”打开“计算机管理” 打开计算机管理后点击“存储”-…...

transformer与beter

transformer与beter 解码和编码器含义tokizer标记器和one-hot独热编码编码解码--语义较好的维度空间矩阵相乘--空间变换编码理解如何构造降维的嵌入矩阵--实现到达潜空间上面是基础&#xff0c;下面是transformer正文自注意力机制注意力分数--上下文修正系数为什么需要KQ两个矩…...

MySQL索引设计遵循一系列原则

高频查询与大数据量表&#xff1a;对查询频次较高且数据量较大的表建立索引。这是因为索引主要是为了加速查询过程&#xff0c;对于经常需要访问的表和数据&#xff0c;索引的效果最为显著。 选择合适索引字段&#xff1a;从WHERE子句中提取最佳候选列作为索引字段&#xff0c…...

windows窗口消息队列与消息过程处理函数

在Windows窗口应用程序中&#xff0c;消息队列和窗口过程函数是实现消息驱动机制的核心组件。 消息队列&#xff08;Message Queue&#xff09;&#xff1a; 消息队列是用于存储窗口消息的缓冲区。当用户与应用程序交互时&#xff0c;系统会将生成的消息插入到消息队列中&…...

【Chisel】chisel中怎么处理类似verilog的可变位宽和parameter

在 Chisel 中处理可变位宽和参数的方式与 Verilog 有一些不同&#xff0c;因为 Chisel 是建立在 Scala 语言之上的。以下是如何在 Chisel 中处理这些概念的方法&#xff1a; 参数化&#xff08;Parameters&#xff09; 在 Chisel 中&#xff0c;参数化是通过在模块构造函数中定…...

[Easy] leetcode-225/232 栈和队列的相互实现

一、用栈实现队列 1、题目 仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a;void push(int x) 将元素 x 推到队列的末尾 int pop() 从队列的开头移除并返回元素 …...

Springboot+Vue项目-基于Java+MySQL的个人云盘管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

Leetcode 116:填充每一个节点的下一个右侧节点指针

给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树定义如下&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到…...

AI智能分析赋能EasyCVR视频汇聚平台,为安全生产监管提供保障

一、背景需求 为提升公共及生产安全监管&#xff0c;深入贯彻落实中央关于智慧城市、数字乡村的部署要求&#xff0c;视频设备融合管理已成为视频治理的必然趋势。针对当前部分地区在视频监控系统建设中存在的问题&#xff0c;如重点地区视频监控系统建设零散、视频监控数据孤…...

Java设计模式 _结构型模式_外观模式

一、外观模式 1、外观模式 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型模式。主要特点为隐藏系统的复杂性&#xff0c;并向客户端提供了一个客户端可以访问系统的接口。这有助于降低系统的复杂性&#xff0c;提高可维护性。当客户端与多个子系统之间存在大量…...

数据结构之----栈与队列

栈是限定仅在表尾进行插入和删除操作的线性表&#xff1b; 队列是只允许在一端进行插入操作&#xff0c;而另一端进行删除操作的线性表&#xff1b; 栈&#xff0c;允许插入和删除的一端称为栈顶&#xff0c;另一端称为栈底&#xff0c;特点后进先出。 插入操作称为进栈&#…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

数据库正常,但后端收不到数据原因及解决

从代码和日志来看&#xff0c;后端SQL查询确实返回了数据&#xff0c;但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离&#xff0c;并且ai辅助开发的时候&#xff0c;很容易出现前后端变量名不一致情况&#xff0c;还不报错&#xff0c;只是单…...

「Java基本语法」变量的使用

变量定义 变量是程序中存储数据的容器&#xff0c;用于保存可变的数据值。在Java中&#xff0c;变量必须先声明后使用&#xff0c;声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例&#xff1a;声明与初始化 public class VariableDemo {publi…...

Element-Plus:popconfirm与tooltip一起使用不生效?

你们好&#xff0c;我是金金金。 场景 我正在使用Element-plus组件库当中的el-popconfirm和el-tooltip&#xff0c;产品要求是两个需要结合一起使用&#xff0c;也就是鼠标悬浮上去有提示文字&#xff0c;并且点击之后需要出现气泡确认框 代码 <el-popconfirm title"是…...

职坐标物联网全栈开发全流程解析

物联网全栈开发涵盖从物理设备到上层应用的完整技术链路&#xff0c;其核心流程可归纳为四大模块&#xff1a;感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性&#xff0c;例如传感器选型需平衡精度与…...