【C++】类型转换【4中类型转换】

news2024/11/23 21:17:03

目录

1. C语言中的类型转换

2. C++的四种类型转换

2.1 static_cast

3.2 reinterpret_cast

3.3 const_cast

3.4 dynamic_cast

3. explict

4.  RTTI(了解)


1. C语言中的类型转换

 在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化 C 语言中总共有两种形式的类型转换: 隐式类型 转换和显式类型转换
  • 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  • 显式类型转化:需要用户自己处理
缺陷:
转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

2. C++的四种类型转换

C 风格的转换格式很简单,但缺点
  • 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  • 显式类型转换将所有情况混合在一起,代码不够清晰
因此 C++ 提出了自己的类型转化风格,注意 因为 C++ 兼容 C 语言,所以 C++ 中还可以使用 C 语言的 转化风格
标准 C++ 为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast

2.1 static_cast

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


3.2 reinterpret_cast

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

若代码中reinterpret_cast改为static_cast则会报错


3.3 const_cast

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

常考面试题:

观察监视窗口下都是20

输出结果却是20和10

原因:const类型变量默认放在寄存器中,【因为const变量不能改】,寄存器中比较快,
我不能直接访问内存,都要先放到缓存或寄存器中,访问直接去寄存器中访问,所以你
改的是内存中的,而实际取的是寄存器中的,这里打印10是因为ci存储的内存被改了,但ci被放进了寄存器,要去寄存器中取,还是10,本质是因为编译器对const对象存取优化机制导致

若想禁止编译器进行优化,可以用关键字volatile

volatile const int ci = 10;//这样就会到内存中取了


3.4 dynamic_cast

 dynamic_cast 用于将一个父类对象的指针 / 引用转换为子类对象的指针或引用 ( 动态转换 )
向上转型:子类对象指针 / 引用 -> 父类指针 / 引用 ( 不需要转换,赋值兼容规则 )
向下转型:父类对象指针 / 引用 -> 子类指针 / 引用 ( dynamic_cast 转型是安全的 )
注意:
1. dynamic_cast 只能用于父类含有虚函数的类
2. dynamic_cast 会先检查是否能转换成功,能成功则转换,不能则返回 0(nullptr也行)
class A
{
public:
	virtual void f()
	{}
	int _a;
};

class B : public A
{
public:
	int _b;
};

void f_cast(A* pa)
{
	//如果想区分pa是指向父类,还是子类对象
	//B* pb = (B*)pa; //C语言的强制类型转换无法解决问题
	//pb->_a = 1;
	//pb->_b = 2;
	
	//若pa指向子类对象,则转换成功,若pa指向父类对象,则转换失败,返回nullptr
	B* pb = dynamic_cast<B*>(pa);
	if (pb != nullptr)
	{
		cout << "转换成功:pa指向子类对象" << endl;
		pb->_a = 1;
		pb->_b = 2;
	}
	else
	{
		cout << "转换失败:pa指向父类对象" << endl;
	}
}

int main()
{
    A a;
    B b;
    
    A* pa = &a;
    f_cast(pa);

    pa = &b;
    f_cast(pa);

    return 0;
}

运行结果:

dynamic_cast如何识别父类的指针是指向父类还是子类对象呢?【dynamic_cast原理】

注意:
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。 强烈建议避免使用强制类型转换

3. explict

 修饰单参数的构造函数:

 修饰多参数的构造函数:


4.  RTTI(了解)

RTTI:Run-time Type identification的简称,即:运行时类型识别。

C++ 通过以下方式来支持 RTTI
1. typeid 运算符
2. dynamic_cast 运算符
3. decltype

 

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

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

相关文章

利用人工智能和大数据分析增强互联网医院APP

随着移动互联网的快速发展和人工智能技术的日益成熟&#xff0c;互联网医院APP正逐渐成为人们获取医疗服务的重要渠道。借助人工智能和大数据分析&#xff0c;互联网医院APP能够提供更加精准、便捷的医疗服务&#xff0c;为用户带来全新的医疗体验。 首先&#xff0c;人工智能…

腾讯云双11优惠活动有哪些?详细攻略来了!

2023年腾讯云双11大促活动正在火热进行中&#xff0c;百款热门云产品11.11云上盛惠&#xff0c;领折上折代金券最高再省9999元&#xff0c;助力开发者轻松上云&#xff01; 一、腾讯云双11活动入口 活动地址&#xff1a;点此直达 二、腾讯云双11活动时间 即日起至2023-11-30…

【中间件篇-Redis缓存数据库02】Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis高级特性和应用(慢查询、Pipeline、事务、Lua) Redis的慢查询 许多存储系统&#xff08;例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间&#xff0c;当超过预设阀值,就将这条命令的相关…

Git 入门使用

一、Git 入门 1.1 Git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git是目前世界上最先进的分布式版本控制系统&#xff0c;没有之一&a…

【自动化测试】Pytest框架 —— 跳过测试和失败重试

1、Pytest跳过测试用例 自动化测试执行过程中&#xff0c;我们常常出现这种情况&#xff1a;因为功能阻塞&#xff0c;未实现或者环境有问题等等原因&#xff0c;一些用例执行不了&#xff0c; 如果我们注释掉或删除掉这些测试用例&#xff0c;后面可能还要进行恢复操作&#…

NSSCTF第11页(3)

[羊城杯 2020]easyphp 源码 发现会在写入文件之前会删除目录下的除了index.php的文件。写入文件的文件名和文件内容也是可控的&#xff0c;只不过存在过滤 stristr函数对文件内容进行过滤&#xff0c;该函数绕过还是简单的&#xff0c;只需要添加一些特殊字符就可以了&#…

2013年108计网

第33题 在 OSI 参考模型中, 下列功能需由应用层的相邻层实现的是()A. 对话管理B. 数据格式转换C. 路由选择D. 可靠数据传输 很显然&#xff0c;题目所问的应用层的相邻层是表示层。该层实现与数据表示相关的功能。选项a中的对话管理属于会话层。选项c中的路由选择属于网络层。…

U-Mail信创邮件系统解决方案

近年来&#xff0c;在国家政策的大力引导和自身数字化转型需求驱动下&#xff0c;国产化成为国内数字化发展道路上的关键词&#xff0c;企业不断加强自主创新能力&#xff0c;进行信创建设&#xff0c;实现软硬件系统国产化替代&#xff0c;已成为大势所趋。邮件系统作为企业管…

Python编程:从入门到实践 (项目3—Web应用程序—学习问题汇总)(新手避坑必看)

本人系统环境&#xff1a; WIN10系统 Python 3.9 Django 2.1.5 书本环境&#xff1a; Python 3.x Django 1.8.5 基于Django 开发一个名为“学习笔记”的项目&#xff0c;这是一个在线的日志系统&#xff0c;能够记录所学习的有关特定主题的知识。 建立项目 要编写一个名为“…

vscode文件跳转(vue项目)

在 .vue 文件中&#xff0c;点击组件名打开 方式1&#xff1a; 在 vue 组件名上&#xff0c;桉住ctrl 鼠标左键 // 重新打开一个tab 方式2&#xff1a; 在 vue 组件名上&#xff0c;桉住ctrl shift 鼠标左键 // 在右侧拆分&#xff0c;并打开一个tab .vue文件的跳转 按住 …

el-date-picker精确到分钟

0 效果 1 代码 使用format、value-format属性格式化即可 :clearable“false” // 取消删除图标 注意&#xff1a; format&#xff1a;“yyyy-MM-dd HH:mm” 小时默认是从00:00开始 format&#xff1a;“yyyy-MM-dd hh:mm” 小时默认是从12:00开始

ElasticSearch的文档、字段、映射和高级查询

1. 文档&#xff08;Document&#xff09; 在ES中一个文档是一个可被索引的基础信息单元&#xff0c;也就是一条数据 比如&#xff1a;你可以拥有某一个客户的文档&#xff0c;某一个产品的一个文档&#xff0c;当然&#xff0c;也可以拥有某个订单的一个文档。文档以JSON&…

java通过FTP跨服务器动态监听读取指定目录下文件数据

背景&#xff1a; 1、文件数据在A服务器&#xff08;windows&#xff09;&#xff08;不定期在指定目录下生成&#xff09;&#xff0c;项目应用部署在B服务器&#xff08;Linux&#xff09;&#xff1b; 2、项目应用在B服务器&#xff0c;监听A服务器指定目录&#xff0c;有新…

UI设计软件有哪些好用和免费的吗?

在我们分享五个有用的原型工具之前&#xff0c;完成原型&#xff0c;将优化界面&#xff0c;这次是UI设计师的任务&#xff0c;UI设计软件对设计师非常重要&#xff0c;UI设计工具是否使用直接影响最终结果&#xff0c;然后有人会问&#xff1a;UI界面设计使用什么软件&#xf…

2021年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 Python 中函数不包括&#xff1f; A&#xff1a;标准函数 B&#xff1a;第三库函数 C&#xff1a;内建函数 D&#xf…

如何判断被DDoS攻击

当网络和设备正常的情况下&#xff0c;服务器突然出现连接断开、访问卡顿、用户掉线等情况;服务器CPU或内存占用率出现明显增长;网络出入流量出现明显增长;网站或应用程序突然出现大量的未知访问;登录服务器失败或者登录过慢等等。以上是最为常见的服务器被 DDoS攻击后出现的几…

【赠书第2期】嵌入式虚拟化技术与应用

文章目录 前言 1 背景概述 2 专家推荐 3 本书适合谁&#xff1f; 4 内容简介 5 书籍目录 6 权威作者团队 7 粉丝福利 前言 随着物联网设备的爆炸式增长和万物互联应用的快速发展&#xff0c;虚拟化技术在嵌入式系统上受到了业界越来越多的关注、重视和实际应用。嵌入式…

鸿蒙开发工具的汉化

1、下载汉化包 汉化插件下载地址&#xff1a;Chinese (Simplified) Language Pack / 中文语言包 - IntelliJ IDEs Plugin | Marketplace 百度网盘下载地址&#xff1a;链接&#xff1a;百度网盘 请输入提取码 DevEco Studio是基于IDEA223版本&#xff0c;下载汉化包时请注意…

【经验模态分解】2.EMD的3个基本概念

/*** poject 经验模态分解及其衍生算法的研究及其在语音信号处理中的应用* file EMD的3个基本概念* author jUicE_g2R(qq:3406291309)* * language MATLAB/Python/C/C* EDA Base on matlabR2022b* editor Obsidian&#xff08;黑曜石笔记软件…