【C++】-c++的类型转换

news2025/5/25 6:17:53

在这里插入图片描述
💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言
  • 一、C语言的类型转换
  • 二、为什么C++需要四种类型转换
  • 三、 C++强制类型转换
    • 四、总结


前言

今天将一个知识量不是很大,而且建议使用的东西,相信大家看到类型转换的时候就觉得这不是C语言的时候就学了吗??为什么现在拿出来提,但又看到C++的类型转换,说明这是C++新出来的,大家都是知道C++是兼容c语言的,所以再C里面的类型转换再C++里面也适用,而今天将的是C++里面的类型转换,是为了规范C语言里面类型转换出现的不安全问题,所以,接下来我们就来进入正文进行讲解。


一、C语言的类型转换

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

显示类型转换:
我们来看案例:

int main()
{
	//显示的类型转换

	//相关类型的显示类型转换
	int i = 0;
	int* p = &i;  
	int address = (int)p;

	double b = 1.1;//可能会造成精度丢失
	i = (int)b;

	//不相关类型的显示类型转换
	vector<int> v;
    string s;
    v = (vector<int>)s;
	return 0;
}

隐式类型转换:

void insert(size_t pos, char ch)
{
	int end = 10;
	while (end >= pos)//会进行隐式类型转换,将end类型转换成int,会死循环
	{
		cout << end << endl;
		//...
		--end;
	}
}

double b = 1.1;
i = b;

const变量也可以修改

	const int n = 10;
	//转换有安全隐患的
	int* p = (int*)&n;
	(*p)++;
	
	cout << n << endl;
	cout << *p << endl;

在这里插入图片描述

大家看到从监视窗口看到的值和打印的值不一样,原因就是监视窗口里面的值是内存里面里面的值,而打印的时候没有直接去内存里面去拿值,而是再寄存器的时候直接进行的替换,我们可以使用一个关键字让他到内存里面取volatile
在这里插入图片描述
上面的办法就是让const去掉常性。

上面的几种场景我们发现都可能会出现问题,而且每种转换可视性较差,所以的转换都是相同的方式,再前面加类型就可以,看需要人自己来判断。

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

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

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

三、 C++强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast
(1)static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用
static_cast,但它不能用于两个不相关的类型进行转换


double b = 1.1;
i = static_cast<int>(b);

这样就可以很好的知道这是隐式类型转换。

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

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);

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

  int* p = const_cast< int*>(&a );
  *p = 3;
  cout<<a <<endl;

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

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

这是指针c++特有的,c语言没有继承
我们来看一个例子:

class a
{
public:
	virtual void f() {}

	int _x = 0;
};

class b : public a
{
public:
	int _y = 0;
};
void fun(A* pa)
{
	B* pb = (B*)pa;
	pb->_x++;
	pb->_y++;
}

int main()
{
	A aa;
	fun(&aa);

	B bb;
	fun(&bb);

	return 0;
}

我们再传参的时候,形参接收实参的过程是向上转型没有问题,但是函数体里面有一个将父类指针强转给子类指针,第一中会报错,原因是,我们B*让pa的访问范围变大了,本来就智能访问_x,现在可以访问_y,而A类里面没有_y就会报错,这种错误我们是很难知道的,所以需要使用 dynamic_cast

void fun(A* pa)
{
	//pa是指向子类对象B的,转换可以成功,正常返回地址
	// pa是指向父类对象A的,转换失败,返回空指针
	B* pb = dynamic_cast<B*>(pa);
	if (pb)
	{
		cout << "转换成功" << endl;
		pb->_x++;
		pb->_y++;
	}
	else
	{
		cout << "转换失败" << endl;
	}
}

在这里插入图片描述
这样就很好的避免我们上面会出现到的问题了
注意

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

四、总结

到这里面我们的类型转换就讲解完毕了,大家再平时中试着慢慢使用这些,对以后再开发中又帮助,可以帮助我们减少很多不必要的麻烦,这节的内容不难,大家下来好好的去理解一下,我么拿下篇介绍特殊类的设计。

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

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

相关文章

020-第三代软件开发-日志模块

第三代软件开发-日志模块 文章目录 第三代软件开发-日志模块项目介绍日志模块日志Demo第一代日志系统第二代日志系统 关键字&#xff1a; Qt、 Qml、 日志、 Log、 SQLite 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Ob…

【Java基础面试三十四】、接口中可以有构造函数吗?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;接口中可以有构造函数吗…

Day3 Qt

作业 1. 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中 如果账号和密码不…

经典算法试题(一)

文章目录 一、19头牛1、题目2、思路讲解3、代码实现4、结果 二、分钱1、题目2、思路讲解3、代码实现4、结果 三、儿子做题1、题目2、思路讲解3、代码实现4、结果 四、乐队人数1、题目2、思路讲解3、代码实现4、结果 五、靶子趣谈1、题目2、思路讲解3、代码实现4、结果 六、里程…

外骨骼机器人和人形机器人概览

前言&#xff1a;一点思考 外骨骼机器人和人形机器人都曾随着一些爆品的出现火热过一段时间&#xff0c;但总感觉当前技术条件还不成熟&#xff0c;真正能落地的应用场景不多。马斯克在擎天柱发布会上被问到人形机器人的落地与前景问题时并没有给出明确答案&#xff0c;只是用…

《Selenium 2 自动化测试实战》读书笔记

背景 最近在弄 appium&#xff0c;然后顺便发现了 Selenium 框架和这本书&#xff0c;恰好这本书也介绍了一些软件测试 & 自动化测试的理论知识&#xff0c;遂拿过来学习学习。所以本文几乎没有实践内容&#xff0c;大多都是概念和工具的 mark&#xff0c;后续若有实践&am…

bulldog 靶机

bulldog 信息搜集 存活检测 详细扫描 后台网页扫描 网页信息搜集 正在开发的如果你正在读这篇文章&#xff0c;你很可能是Bulldog Industries的承包商。恭喜你!我是你们的新老板&#xff0c;组长艾伦布鲁克。CEO解雇了整个开发团队和员工。因此&#xff0c;我们需要迅速招到一…

JVM(Java Virtual Machine)垃圾收集算法篇

前言 本文参考《深入理解Java虚拟机》&#xff0c;主要介绍GC相关的算法&#xff0c;引用计数法、可达性分析算法、垃圾收集算法&#xff08;分代收集理论&#xff0c;标记-清除/整理/复制&#xff09; 本系列其他文章链接&#xff1a; JVM&#xff08;Java Virtual Machine&…

视频监控/安防监控平台EasyCVR新功能——视频播放id调阅来咯

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

中小型企业云存储选型指南:要点与建议

随着信息技术的快速发展&#xff0c;中小型企业越来越依赖于云存储来管理和存储其日益增长的数据。选择适合自己企业的云存储解决方案是确保数据安全、提高工作效率的关键。 选型注意点&#xff1a; 选择适合自己企业的云存储方案 在选择适合自己企业的云存储方案时&#xff…

日志回滚工作原理剖析及在文件系统的作用

日志回滚原理 当涉及到崩溃恢复和一致性保护时&#xff0c;日志回滚是一种常见的机制。它通过记录写入操作到一个事务日志中&#xff0c;而不是直接应用到文件系统&#xff0c;以保护文件系统的一致性。下面是日志回滚的一般工作原理&#xff1a; 日志记录&#xff1a;在进行写…

【COMP305 LEC 1 2】

Part 1 Artificial Neural Networks(ANN) Topic 1 Historical/Biological Introduction 1. Biological Excitability (a. Virtually all living cells maintain an electrical potential difference between their interiors and the environment (exteriors) . 内部和外…

1812_参考spacemacs的文档拆解ivy layer的组成

全部学习汇总&#xff1a; GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 升级了spacemacs的配置&#xff0c;之后重新翻了一下spacemacs的文档。看到了这里面的一个核心的结构layer。这样&#xff0c;结合文档并且找出一个layer来看…

【多线程】线程安全问题和解决方案

我们来看下面这一段代码 public class demo {public static void main(String[] args) throws InterruptedException {Cou count new Cou();Thread t1 new Thread(() -> {for (int i 0; i < 10000; i) {count.add();}});Thread t2 new Thread(() -> {for (int i …

王道计算机考研 操作系统学习笔记篇章二: 进程管理

目录 进程与线程 进程的概念 概念 进程的组成 PCB 程序段、数据段 进程的特征 总结 进程的状态与转换 进程的状态 创建态、就绪态 运行态 阻塞态 终止态 进程的转换 进程的组织 链接方式 索引方式 总结 进程控制 什么是进程控制 如何实现进程控制 进程控制相关的原…

Opencv之RANSAC算法用于直线拟合及特征点集匹配详解

Opencv之RANSAC算法用于直线拟合及特征点集匹配详解 讲述Ransac拟合与最小二乘在曲线拟合上的优缺点 讲述在进行特征点匹配时&#xff0c;最近邻匹配与Ransac匹配的不同之处 另外&#xff0c;Ransac也被用于椭圆拟合、变换矩阵求解等 1. 直线拟合 1.1 原理 RANSAC(RANdom …

两分钟搞懂UiAutomator自动化测试框架

1. UiAutomator简介 UiAutomator是谷歌在Android4.1版本发布时推出的一款用Java编写的UI测试框架&#xff0c;基于Accessibility服务。其最大的特点就是可以跨进程操作&#xff0c;可以使用UiAutomator框架提供的一些方便的API来对安卓应用进行一系列的自动化测试操作&#xf…

Linux程序调试器——gdb的使用

gdb的概述 GDB 全称“GNU symbolic debugger”&#xff0c;从名称上不难看出&#xff0c;它诞生于 GNU 计划&#xff08;同时诞生的还有 GCC、Emacs 等&#xff09;&#xff0c;是 Linux 下常用的程序调试器。发展至今&#xff0c;GDB 已经迭代了诸多个版本&#xff0c;当下的…

C#上位机序列9: 批量读写+事件广播+数据类型处理

一、源码结构&#xff1a; 二、运行效果&#xff1a; 三、源码解析 1. 读取配置文件及创建变量信息&#xff08;点位名称&#xff0c;地址&#xff0c;数据类型&#xff08;bool/short/int/float/long/double&#xff09;&#xff09; 2. 异步任务处理&#xff1a;读任务&…

c++_learning-并发与多线程

并发与多线程 并发&#xff1a;进程&#xff1a;线程&#xff1a;基本概念&#xff1a;线程安全&#xff1a;问题出现的场景&#xff1a;涉及的性质&#xff1a;如何保证线程安全&#xff1f; 并发的实现手段&#xff08;优先使用多线程并发&#xff09;&#xff1a;多进程并发…