【C++从小白到大牛】C++的隐式和显示类型转换基础知识讲解

目录

1、C语言中的类型转换

2、C语言和C++中可以相互转换的类型总结

C语言:

CPP:                                

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

4、C++四大强制类型转换

4.1static_cast

4.2 reinterpret_cast

4.3 const_cast

4.4dynamic_cast

注意点:

1、C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。

  1.  隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理
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);
}
  • 缺陷:有序列表

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

2、C语言和C++中可以相互转换的类型总结

C语言:

  • 整形之间 隐式类型转换
  • 整形和浮点数 隐式类型转换
  • bool和整形 bool和指针 隐式类型转换
  • 指针和整形 强制类型转换
  • 不同类型的指针之间 强制类型转换

CPP:                                

构造函数只支持

  • 内置类型->自定义类型之间,本质借助构造 隐式类型转换 如:string和const char*
  • 自定义类型之间->内置类型, 本质要重载一个operator类型 隐式类型转换 如:下面的A
  • 自定义类型之间->自定义类型之间,本质借助构造,隐式类型转换 如:initializer_list和容器
class A
{
public:operator int(){return _a1 + _a2;}
private:int _a1 = 1;int _a2 = 2;
};void Test()
{A aa;int ii1 = aa;// 将自定义类型转换为内置类型// 需要重载operatorint ii2 = (int)aa;int i = 1;// 隐式类型转换double d = i;printf("%d, %.2f\n", i, d);int* p = &i;// 显示的强制类型转换int address = (int)p;char ch = i;printf("%p, %d\n", p, address);// 无法转换,他们之间没有关联// double dd = (double)p;
}

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

C风格的转换格式很简单,但是有不少缺点的: 

  1.  隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  2.  显式类型转换将所有情况混合在一起,代码不够清晰

因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

4、C++四大强制类型转换

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

4.1static_cast

static_cast对应之前的隐式类型转换,以前的隐式类型转换也能玩,但是建议使用static_cast

但它不能用于两个不相关的类型进行转换

int main()
{double d = 12.34;int a = static_cast<int>(d);cout<<a<<endl;return 0;
}

4.2 reinterpret_cast

reinterpret_cast对应的强制类型转换。

下面代码中使用static_cast会报错,因为整形转换成指针是强制类型转换,而static_cast对应的是隐式类型转换,所以我们就要使用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;
}

4.3 const_cast

const_cast对应的也是强制类型转换,那这里与上一个的reinterpret_cast有什么区别呢?

我们这里不妨先看一个问题:

监视窗口里面都是3,为什么打印结果是2呢?

 这里本质原因是编译器做的优化

编译器默认将const属性的值放在寄存器里面,这里在内存里面确实将a改成了3,但是在寄存器里面仍然是2,监视窗口是从内存的角度看的,但是编译器是从寄存器里面取的a,因此结果一个是2,一个是3

如何解决呢?用volatile关键字,表示直接从内存当中取,这样打印结果就正确的表示出来是3,3

所以这里就可以回答上面的问题,强制类型转换,但是为什么要把去掉const属性单独拿出来?

就是专门提醒,去掉const属性是有一些内存可见优化(将const类型的值放在寄存器当中存储)的风险,要注意是否加了volatile关键字

4.4dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则,切片操作)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

注意点:

  1.  dynamic_cast只能用于父类含有虚函数的类
  2.  dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
  3. 父类的对象不可能支持强制类型转换为子类,这里向下转换只支持对象的指针/引用
class A
{
public:// 父类必须含有虚函数virtual void f() {}int _a = 0;
};class B : public A
{
public:int _b = 1;
};void fun(A* pa)
{// 向下转换:父->子// pa指向子类对象,转回子类,是安全的// pa指向父类对象,转回子类,是不安全的,存在越界的风险问题// 不安全//B* pb = (B*)pa;//  pa指向子类对象,转回子类,正常转换//  pa指向父类对象,转回子类,转换失败B* pb = dynamic_cast<B*>(pa);if (pb){cout << pb << endl;cout << pb->_a << endl;cout << pb->_b << endl;}else{cout << "转换失败" << endl;}
}

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

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

相关文章

基于x86 平台opencv的图像采集和seetaface6的性别识别功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.3 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的性别识别功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的性别识别模块从而实现…

谓词和量词

一、个体词和谓词 命题是一句陈述句&#xff0c;命题由个体词和谓词组成。 个体词是句子中的主语部分&#xff0c;比如这里的王童。 谓词是句子里的剩余部分&#xff0c;比如是一个三好学生 个体词用小写字母表示&#xff0c;谓词用大写字母&#xff0b;&#xff08;&#…

数据库(专业存储数据)

数组、链表、变量----->内存&#xff1a;程序运行结束&#xff0c;数据丢失 文件-------------->硬盘 数据库&#xff1a;专业存储数据&#xff0c;大量数据----------->硬盘 一、数据库文件与普通文件区别: 1.普通文件对数据管理(增刪改查)效率低 2.数据库对数据…

算法: 双指针

题目&#xff1a;环形链表 题目讲解&#xff1a; 判断环 要判断链表是否有环&#xff0c;可以使用快慢指针的方法。快指针每次走两步&#xff0c;慢指针每次走一步。如果链表有环&#xff0c;快慢指针最终会相遇&#xff1b;如果没有环&#xff0c;快指针会先到达链表末尾。 …

MySQL:简述对事务的认识

浅谈对Spring事务的认识&#xff1a;https://xiaoer.blog.csdn.net/article/details/80849971 一、事务的特性 事务是数据库永恒不变的话题&#xff0c; ACID&#xff1a;原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久性。 &#xff08;1&#xff09;原子性&am…

基于麒麟信安操作系统的光伏发电功率预测系统完成大规模部署建设

麒麟信安操作系统&#xff0c;作为行业数智化建设的安全根基&#xff0c;为电力业务系统提供了稳定可靠的底层平台&#xff0c;在全球能源结构转型大潮中扮演着至关重要的角色。某光伏电站项目中&#xff0c;基于麒麟信安操作系统的光伏发电功率预测系统完成大规模部署建设&…

手机游玩植物大战僵尸杂交版V2.3.7最新版教程(文章末尾免费直接下载链接)

最新版植物大战僵尸杂交版V2.3.7手机游玩教程 【V2.3.7全面升级】植物大战僵尸杂交版&#xff1a;跨平台终极安装指南 - 苹果、安卓、电脑、电视兼容&#xff0c;界面革新&#xff0c;16卡槽扩展&#xff0c;高分辨率支持&#xff0c;BUG修复&#xff0c;畅享游戏乐趣 前言 …

Java Web —— 第九天(事务)

事务管理 & AOP 事务回顾 概念 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;这些操作 要么同时成功&#xff0c;要么同时失败 操作 开启事务(一组操作开始前&#xff0c;开启事务): start transaction / begin 提交事务(这组操作全部成功…

Word文档被锁定无法编辑怎么办?一键快速移除Word编辑限制

有没有遇到这种情况&#xff1f;打开Word文档后&#xff0c;准备对Word软件进行文档的编辑时&#xff0c;发现文档有部分内容无法进行编辑了&#xff0c;不知道怎么回事&#xff0c;其实这是因为无法编辑区域被锁定了&#xff0c;所以无法进行编辑&#xff0c;那么应该怎么解除…

Scrapy 分布式爬虫框架 Scrapy-Redis

github官网代码示例&#xff1a;https://github.com/rmax/scrapy-redis/blob/master/example-project/example/spiders/myspider_redis.py 什么是 Scrapy-Redis Scrapy-Redis 是一个基于 Scrapy 的扩展&#xff0c;用于实现分布式爬虫。它利用 Redis 作为分布式队列来共享待爬…

【Qt窗口】—— 浮动窗口

目录 1.1 浮动窗口的创建 1.2 设置停靠的位置 1.3 示例小结 在Qt中&#xff0c;浮动窗口也称之为铆接部件&#xff0c;俗称为子窗口&#xff0c;浮动窗口是通过QDockWidget类来实现浮动的功能。浮动窗口⼀般是位于核⼼部件的周围&#xff0c;可以有多个。 1.1 浮动窗口的…

CAD如何批量输出PDF?介绍了三种方式

CAD如何批量输出PDF&#xff1f;在工程设计、建筑制图以及产品设计等领域&#xff0c;CAD软件是不可或缺的工具。随着项目规模的扩大&#xff0c;如何将CAD图纸批量转换成PDF格式以便分享、打印或存档&#xff0c;成为了许多设计师面临的常见问题。下文将介绍三种高效的方法&am…

springboot3.x入门系列【5】支持unix sock 套接字服务

目录 一、简介 二、springBoot3.x 套接字的支持 1. 环境要求 2. springboot内置tomcat 2.1 支持unix 设置 unixDomainSocketPath 2.2 windows 下unix服务测试 3. springboot外置tomcat 3.1 tomcat 配置unix socket 套接字 3.2 启动tomcat 服务 3.3 nginx 支持unix…

SLAM学习笔记

从《slam十四讲开始》 slam十四讲推荐的其他书籍 《概率机器人》&#xff08;Probabilistic robotics &#xff09; 《计算机视觉中的多视图几何》&#xff08;Multiple View Geometry in Computer Vision &#xff09; 《机器人学中的状态估计》&#xff08;State Estimation…

操作系统

操作系统是控制和管理计算机硬件和软件资源。 管理和控制电脑系统软硬件资源的软件叫作操作系统&#xff0c;操作系统是最基本、最重要的系统软件&#xff0c;由一组控制计算机系统并对计算机系统进行管理的程序组成&#xff0c;是用户与计算机硬件系统的接口&#xff0c;并为用…

VMware网络模式

一.VMware虚拟网络 VMware支持共创建20个虚拟网络&#xff0c;相当于现实生活的交换机&#xff0c;名称vmnet0---vmnet19 物理机用虚拟网卡和对应的虚拟网络中的虚拟机通信。 VMnet1和VMnet8这两个虚拟网卡的作用是保证windows和虚拟机可以正常通信。VMware Workstation Pro这…

python-读写Excel:xlwings库操作

几种操作Excel的python库对比 安装:pip install xlwings 目录 APP实例化对象 工作薄对象 创建工作薄 打开工作薄 工作薄属性 工作表对象 新增工作表 复制表 获取工作表对象 工作表属性 删除和清除表数据及表格式 工作表行高列宽(自动调整) 单元格对象 获取单元…

秋冬春夏,纪念在CSDN的第365天

目录 时光 收获 工作 生活 憧憬 时光 再次收到创作纪念日的消息时&#xff0c;已在CSDN创作和度过了一年的时光。创作&#xff0c;成了自己的第二工作空间&#xff0c;成为了日常的一种习惯。 每当看到第1篇文章的提醒消息&#xff0c;都会想起当时创作的初衷和情景。是一…

在手机在线预览3D模型,是如何实现的?

在手机在线预览3D模型&#xff0c;主要依赖于几个关键技术和步骤来实现。以下是一个概括性的流程&#xff1a; 一、模型上传 选择平台&#xff1a;首先&#xff0c;用户需要选择一个支持3D模型在线预览的平台&#xff0c;如51建模网、Sketchfab等。这些平台通常提供用户友好的…

五分钟本地部署Uptime Kuma运维监控结合内网穿透实现远程访问

文章目录 前言**主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址…