(强制)类型转换方法

news2024/11/18 16:52:40

目录

一、C语言中的类型转换

二、C++中的强制类型转换

2.1 static_cast

2.2 reinterpret_cast

2.3 const_cast

2.4 dynamic_cast

2.5 总结


一、C语言中的类型转换

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

隐式类型转化:编译器在编译阶段自动进行,能转则转,不能转则编译失败
显式类型转化:需要用户自行处理

#include <stdio.h>
int main()
{
	// 隐式类型转换
	int i = 1;
	double d = i;
	printf("%d, %.2f\n", i, d);//1, 1.00
	
	// 显示的强制类型转换
	int* p = &i;
	int address = (int)p;
	printf("%p %d\n", p, address);//008FF8EC 9435372

	return 0;
}

缺点:

1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
2. 显式类型转换的可视性比较差,所有转换形式都以同一种形式书写,难以跟踪错误的转换

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

二、C++中的强制类型转换

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

2.1 static_cast

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

#include <iostream>
using namespace std;
int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);
	cout << a << endl;//12
	return 0;
}

2.2 reinterpret_cast

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

#include <iostream>
using namespace std;
int main()
{
	int a = 12;

	//这种情况使用static_cast会报错
	//int *p = static_cast<int*>(a);//类型转换无效

	int* p = reinterpret_cast<int*>(a);
	return 0;
}


 

2.3 const_cast

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

#include <iostream>
using namespace std;
int main()
{
	const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	cout << a << endl;//2
	cout << *p << endl;//3
	return 0;
}

有的同学可能已经发现了问题,为什么输出a的结果是2啊!(这是一道常见面试题)

在VS环境下,a这种const修饰的常量编译器认为是不可修改的,直接用类似于宏替换的方式进行处理。所以内存中a常量的那块空间其实是已经被修改了的,这也是输出*p等于3的原因。

在某些平台下面,会将a常量存储在寄存器中便于快速访问,内存中实际上已经被修改了,但输出时访问的是寄存器,所以输出a的结果是2。

要想解决这个问题,用volatile关键字修饰const变量即可,此时输出结果就都为3了。

volatile const int a = 2;

 

2.4 dynamic_cast

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

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

注意:
1. dynamic_cast要求父类必须含有虚函数
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

#include <iostream>
using namespace std;

class A
{
public:
	virtual void f(){}
public:
	int _a = 0;
};
class B : public A
{
public:
	int _b = 1;
};

void Func(A* pa)
{
	if (pa == nullptr) return;

	//若pa是指向子类,那么可以转换,转换表达式返回正确的地址
	//若pa是指向父类,那么不能转换,转换表达式返回nullptr

	B* pb = dynamic_cast<B*>(pa); // 安全的
	//B* pb = (B*)pa;             // 不安全

	if (pb){
		cout << "转换成功" << endl;
		pb->_a++;
		pb->_b++;
		cout << pb->_a << ":" << pb->_b << endl;
	}
	else
	{
		cout << "转换失败" << endl;
		pa->_a++;
		cout << pa->_a << endl;
	}
}

int main()
{
	//A aa;
	//Func(&aa);
	B bb;
	Func(&bb);
	return 0;
}

2.5 总结

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

强烈建议:避免使用强制类型转换,若需使用即使用C++中的强制类型转换(更加安全)。

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

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

相关文章

[PyTorch笔记]深度学习计算

[PyTorch笔记]深度学习计算1 层和块1.1自定义神经网络块1.2顺序块1.3在前向传播中执行代码2.参数管理2.1 访问参数、用于调试、诊断和可视化2.2 参数初始化2.2.1内置初始化&#xff1a;2.2.2 自定义初始化2.3 在不同模型组件间共享参数3.延后初始化4.自定义层4.1 不带参数的层4…

深入理解数据结构 —— 跳表

什么是跳表 只要是平衡搜索二叉树能实现的功能&#xff0c;跳表都能实现&#xff0c;且时间复杂度都相同 例如&#xff1a; 哈希表的功能&#xff1a;插入&#xff0c;查找&#xff0c;删除有序表的功能&#xff1a;查找大于某值最小的数&#xff0c;小于某值最大的数&#…

干货 | 数据跨境传输合规体系的构建思路

以下内容整理自清华大学《数智安全与标准化》课程大作业期末报告同学的汇报内容。第一部分&#xff1a;研究背景随着经济活动数字化转型加快&#xff0c;“数据”对生产、流通、分配和消费活动产生重要影响&#xff0c;成为新的生产要素。地区之间数据流通愈发频繁&#xff0c;…

图像频域滤波(理想低通滤波)

图像变换是对图像信息进行变换&#xff0c;是能量保持但重新分配&#xff0c;利于加工处理。这里主要介绍傅里叶变换的图像频域滤波。 图像从空间域变换到频域后&#xff0c;其低频分量对应图像中灰度值变化较为缓慢的区域&#xff0c;高频分量表征图像中物体的边缘和随机噪声等…

基于yolov5的钢材表面缺陷识别(pycharm连接远程服务器,老版本yolov5运行遇到的问题)

时间&#xff1a;2023年1月 1 pycharm远程连接服务器 提示&#xff1a;需要下载pycharm专业版。 参考文献&#xff1a; [1] [2] [3] [4] 设置解释器的界面有一些不同&#xff0c;在此截图记录一下。 &#xff08;这是已经弄好了之后回头截图的&#xff0c;假设它不存在哈) …

【寒假每日一题】洛谷 P6206 [USACO06OCT] Another Cow Number Game G

题目链接&#xff1a;P6206 [USACO06OCT] Another Cow Number Game G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 奶牛们在玩一种数字游戏&#xff0c;Bessie 想让你帮她预测一下结果。游戏开始时&#xff0c;Bessie 将得到一个正整数 N。此时她的分数为 0。 奶…

C 程序设计教程(07)—— 数据类型转换

C 程序设计教程&#xff08;07&#xff09;—— 数据类型转换 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用户阅读。 目录C 程序设计教程&#xff08;07&#xff…

mysql学习总结(一)

总结一下近期学习的mysql内容&#xff1a;这里主要总结一下mysql的底层数据结构索引的本质是什么&#xff1f;索引的本质就是排好序的一种数据结构&#xff0c;通过索引我们能干什么呢&#xff1f;&#xff0c;快速的去定位到我们想要查找的数据&#xff0c;就像是你看书&#…

Ansible 介绍与实战操作演示

文章目录一、概述二、Ansible 架构三、Ansible 工作原理四、Ansible 安装与基础配置1&#xff09;开启记录日志2&#xff09;去掉第一次连接ssh ask确认五、Ansible 的七个命令1&#xff09;ansible2&#xff09;ansible-doc3&#xff09;ansible-playbook4&#xff09;ansible…

非线性系统辨识:非线性 ARX 和 Hammerstein-Wiener

1. 系统辨识 系统辨识是根据系统的输入输出时间函数来确定描述系统行为的数学模型。现代控制理论中的一个分支。通过辨识建立数学模型的目的是估计表征系统行为的重要参数&#xff0c;建立一个能模仿真实系统行为的模型&#xff0c;用当前可测量的系统的输入和输出预测系统输出…

Js逆向教程25-BOM DOM过检测

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程25-BOM DOM过检测 一、JS BOM 检测 它是一种浏览器环境&#xff0c;脱离了浏览器在外部不能直接调用的就是BOM 在浏览器中…

SAP工作流对象类

目录 1. 实现IF_WORKFLOW接口 2. 创建流程属性 3. 接口方法参考 4. 定义事件 5. 工作流触发&#xff08;事件抛出&#xff09; 业务对象作为工作流的数据内核&#xff0c;也是联系业务流程和工作流的重要核心&#xff0c;体现形式一般为BOR或者业务对象类&#xff0c;用来标识不…

SpringCloud从入门到精通(六)

Hystrix-熔断器 Hystrix-概述 • Hystix 是Netflix 开源的一个延迟和容错库&#xff0c;用于隔离访问远程服务、第三方库&#xff0c;防止出现级联失败&#xff08;雪崩&#xff09;。• 雪崩&#xff1a;一个服务失败&#xff0c;导致整条链路的服务都失败的情形 Hystix 主要功…

【Neo4j构建知识图谱】:cypher操作语言加载 CSV电影人数据集链接文件

这目录 数据链接来源1、创建约束2、从 CSV 文件添加节点3、从 CSV 文件添加关系4、运行cypher查询5、清理数据库参考CSV 文件可以使用LOAD CSV密码条款。出于安全原因,无法加载本地CSV文件,这些文件必须在HTTP或HTTPS服务器(如GitHub,Google Drive和Dropbox)上公开访问。使…

Python 中将列表中的每个元素除以一个数字

Python 中将列表中的每个元素除以一个数字&#xff1a; 使用列表理解来遍历列表。在每次迭代中&#xff0c;将当前列表元素除以数字。新列表将包含除法结果。 my_list [8, 12, 20]# ✅ divide each element in list by number new_list [item / 2 for item in my_list] pri…

雪花算法笔记

SnowFlake 雪花算法 SnowFlake 中文意思为雪花&#xff0c;故称为雪花算法。最早是 Twitter 公司在其内部用于分布式环境下生成唯一 ID。在2014年开源 scala 语言版本。 实现原理 雪花算法原理就是生成一个的64位比特位的 long 类型的唯一 id。 最高1位固定值0&#xff0c;因…

React Context 完美替代品 Jotai

1. 前言 React 的属性透传场景 虽然有很多方式可以实现&#xff0c;但能做到代码写的少、re-render 轻松处理的方式并不多。 而状态管理工具 Jotai 却可以很好的解决这些问题。 最近的业务和组件场景里 也在用此方式实现。 2. React Context 的不足 常规解决数据透传通常使…

BUUCTF 之 [ACTF2020 新生赛]Exec(命令执行漏洞)

BUUCTF 之 [ACTF2020 新生赛]Exec&#xff08;命令执行漏洞&#xff09;相关观察进攻相关 项目内容难度简单类型WEB靶场BUUCTF坐标Exec观察 这界面和这网页标题结合起来&#xff0c;相信给位都能猜到这个靶场中很有可能存在命令执行漏洞。 进攻 构造如下语句显示当前路径中的…

Learning Monocular Visual Odometry via Self-Supervised Long-Term Modeling

Paper name Learning Monocular Visual Odometry via Self-Supervised Long-Term Modeling Paper Reading Note URL: https://arxiv.org/pdf/2007.10983.pdf TL;DR ECCV 2020 文章&#xff0c;该文章认为在短时间序列上训练无法在长时间序列上良好泛华&#xff0c;所以受到…

从Web3视角审视茅台的“元宇宙”APP,这或是中国版的“星巴克奥德赛”

图片来源&#xff1a;由无界 AI 绘画工具生成2023年1月1日&#xff0c;一款名为《巽风数字世界》的APP登录App Store&#xff0c;这是由茅台和网易联合推出的虚拟世界APP。因而&#xff0c;有媒体称&#xff0c;茅台要进军元宇宙了&#xff01;简单讲&#xff0c;这是一款虚拟世…