c++类型转换

news2024/11/25 16:50:28

目录

1.隐式类型转换和强制类型转换

2.隐式类型转换带来的危险

3.c++提供的标准类型转换关键字

4.总结


1.隐式类型转换和强制类型转换

c语言的类型转换可以分为隐式类型转换和强制类型转换。

#include<iostream>

using namespace std;

int main()
{
	double a = 3.14;
	int b = a; 
	cout << b << endl;

	int* p = &b;
	int pp = (int)p;
	cout << pp << endl;
	return 0;
}

这里的转换的前提都是这两个类型意义相近。

ps:要区别继承中的切割和隐式类型转换。

class A
{
public:
	A()
	:_a(0)
	{}
private:
	int _a;
};
class B :public A //继承A
{
public:
	B()
	:_b(0)
	,A()
	{}
private:
	int _b;
};
int main()
{
	B b;
	A a = b;//一种原生支持的切割
	return 0;
}

我们要知道隐式类型转换的共性是要生成一个临时对象,明显将b赋值给a的时候不会产生临时对象。只需要将这种方式作为编译器支持的原生方式转换就好。


2.隐式类型转换带来的危险

#include<iostream>

using namespace std;

void Move(size_t pos)
{
	int end = 4;
	while (end >= pos) //发生了隐式类型转换,将int的end转换成了size_t无符号数
	{
		//arr[end + 1] = arr[end]; 向后挪
		end--;
	}
}

int main()
{
	Move(0);
	return 0;
}

这段程序死循环了。

原因是:当end减到-1才应该退出循环,但是因为end和pos在表达式的两边。且两个数意义相近

,因此end变成了无符号数,-1就变成了整形的最大值(要了解负数补码和无符号数的定义)。

end突然搞那么大,就必然跑不出去了奥。


3.c++提供的标准类型转换关键字

a.static_cast<T>

和隐式类型转换一样。

问题:不支持类型差距太大的转换 

 

b.reinterpret_cast<T>

问题: 不支持去除const属性

 

c.const_cast

常用来给const变量赋值(去除const属性):

    const int a = 3;
	int* pp = const_cast<int*>(&a);
	*pp = 4;
	cout << a << endl;

这里有一个奇怪的现象:

显示的结果为a的值依然是3,再通过调试看看内存中a的值:

 

 太神奇了,内存中显示a是4诶。

实际上,这和ide的处理有关,在vs环境下const变量并不是存于常量区中。而是存在一个特殊寄存器中,本质也在栈中。调用时,内存中的const变量就算在内存中发生了变化,但由于已经被寄存器将之前的值读出了,所以我们看见的结果没有发生变化。


d.dynamic_cast

dynamic_cast用于父子类的向下赋值,向上赋值原生支持(切割)。

class A
{
public:
	virtual void f() {}
};
class B : public A	//继承A
{};

void fun(A* pa)
{
	// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回。
	B* pb = dynamic_cast<B*>(pa);
    //转换为B*(子类)

	if (pb)
	{
		cout << "转换成功" << endl;
	}
	else
	{
		cout << "转换失败" << endl;
	}
}
int main()
{
	A a;	B b;
	fun(&a);
	fun(&b);
}

 若是传入A(父类),是一种不安全的转换(可能存在越界问题)。

看图:

 


4.总结

建议使用c++提供的指定类型转换关键字,这种方式更加安全。可以避免隐式类型转换的坑,并且还提供了dynamic_cast和const_cast来处理特殊问题。

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

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

相关文章

医疗保健行业的福音是对话式AI吗?

导读对话式AI可以对医疗保健行业产生重大影响&#xff0c;且在许多领域已经产生了影响。如果使用得当&#xff0c;对话式AI可以提高操作效率和临床结果&#xff0c;并减轻医护人员的工作量。 对话式AI技术开启了数字患者护理的新时代。 患者可以随时访问其需要的数据&#xff…

Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10

Xshell远程连接进行Ubuntu的Pytorch配置写在最前面参考Xshell常用命令Ubantu检查系统的各项配置查看ubuntu系统的版本信息和gcc版本查看Linux的内核版本和系统是多少位的验证机器是否具有n卡各种配置&#xff08;建议不要省略&#xff09;安装vim增加pip镜像源禁用nouveau开启S…

[附源码]计算机毕业设计springboot高校学生摄影作品展示平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

app与小程序的区别【开发小程序】

app与小程序&#xff0c;两者有什么区别呢&#xff1f;很多公司在开发app或是开发小程序上比较纠结&#xff0c;二选一不止究竟选哪个好&#xff0c;当然有财力的公司可能会两者都开发。那么下面说说app与小程序的区别是什么&#xff0c;好让大家更好地二选一。 app与小程序的…

单商户商城系统功能拆解39—分销应用—分销等级

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

2022小美赛数学建模ABCD赛题思路分析 - 认证杯

一、竞赛信息 考虑到美国大学生数学建模竞赛即将举行&#xff0c;近几年国内院校参加美赛的热情一直比较高涨&#xff0c;去年参赛规模已经突破了30000支队&#xff0c;但是由于美赛需要用英文书写论文&#xff0c;中文和英文的语法和思维差异比较明显&#xff0c;另外美赛参赛…

解决 Android WebView 多进程导致App崩溃

应用场景 应用内有两个位置用到WebView加载页面&#xff0c;具体处理逻辑不能通用。分别扩展了WebView了。应用内独立页面使用Fragment来展示,(采用单Activity架构&#xff09;。应用提供切换语言功能。 问题猜想 一、WebView内核bug 具体路径&#xff1a; 进入app–>设…

[附源码]SSM计算机毕业设计校园征兵及退役复原管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ABAQUS学习之路

ABAQUS入门 首先看模块 1、部件——类似建模 2、属性——给零件添加材料属性 3、装配 4、分析步—— 5、相互作用——创建接触&#xff08;摩擦力&#xff09; 6、载荷——预定义场&#xff08;温度场、力场&#xff09;、边界条件 7、网络——划分网格 8、优化&#…

Libvirt Java API操作QEMU虚拟机(重启,强制关机,挂起,恢复,详情,关机,注销,快照备份等 )(CentOS)

需求背景 有个产品需求&#xff0c;需要在一台linux上装多个虚拟机&#xff0c;然后每个虚拟机单独部署一个产品&#xff0c;然后需要虚拟机的一个产品去控制宿主机中安装虚拟机的状态 注意&#xff1a; 如果虚拟机中装的产品去连宿主机的Libvirt服务&#xff0c;那么虚拟机一…

LeetCode530.二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

文章目录530二叉搜索树的最小绝对差c代码实现python 代码实现501二叉搜索树中的众数c 代码实现python 代码实现236二叉树的最近公共祖先c代码实现python代码实现530二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

运维行业数字化维修数据屏来袭

说起维修数字化&#xff0c;售后维保管理&#xff0c;大家必然想到青鸟云报修&#xff0c;今天我给大家呈现一下青鸟云报修数据大屏是怎么一回事。 这是青鸟云报修第三代数据大屏&#xff0c;在2代基础上增加了更多板块&#xff0c;更加专业和智能化&#xff0c;他主要应用于单…

Unity ab包加载文本 puerts 自定义loader

输出ab包 他会把你创建的ab包都打包 也就是在这里的创建的 string assetBundleDirectory Path.Combine(Application.streamingAssetsPath, "OutAssetBundles"); if (!Directory.Exists(assetBundleDirectory)) {Directory.CreateDirectory(assetBundleDirectory);…

2022/11/28-29总结

刷题 统计2021年10月每个退货率不大于0.5的商品各项指标_牛客题霸_牛客网 思路 主要就是sum函数、round函数、date_format函数 代码实现 select product_id, round(sum(if_click)/count(*),3) ctr, round(sum(if_cart)/sum(if_click),3) cart_rate, round(sum(if_payment)…

大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【JavaScript预解析】

JavaScript预解析1 本节目标2 预解析3 变量预解析和函数预解析4 预解析案例1 本节目标 知道解析器运行JS分为哪两步说出变量提升的步骤和运行过程说出函数提升的步骤和运行过程 2 预解析 JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行Java…

技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

深度学习技术在图像识别、搜索推荐等领域得到了广泛应用。近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向&#xff0c;通过《Arm 芯片 Python-AI 算力优化》我们将看到龙蜥社区 Arm 架构 SIG&#xff08;Special Interest Group&#xff09; 利用最新的 Arm 指令集优化…

分析实时云渲染在小程序中可行性应用

点量云小芹和大家分享过很多实时云渲染的优势&#xff0c;比如在网页直接打开&#xff0c;本地无需任何算力支持&#xff0c;所有指令的执行均是在云端服务器上完成的。但在实际中小芹发现很多业主也想在小程序给用户更好的体验&#xff0c;尤其是一些To C的场景下&#xff0c;…

【新知实验室 认识TRTC+四步跑通音视频demo】

1【产品功能介绍】 1.1 什么是TRTC&#xff1f; 实时音视频&#xff08;Tencent RTC &#xff09;是腾讯基于21年来在网络与音频技术上的深度积累&#xff0c;以多人音视频通话和低延时互动直播两大场景化方案&#xff0c;通过腾讯云服务向开发者开放&#xff0c;致力于帮助开…

LabVIEW创建类 2

LabVIEW创建类 2 定义私有数据控件 创建LabVIEW类时&#xff0c;LabVIEW将自动创建类的私有数据控件。请注意在下列项目浏览器窗口中&#xff0c;LabVIEW类的图标是一个有色立方体。该立方体用于代表一个LabVIEW类。私有数据控件的图标是一个带有绿色圆柱体的有色立方体。圆柱…