C++知识点 -- C++的类型转换

news2025/2/23 6:25:57

C++知识点 – C++的类型转换

文章目录

  • C++知识点 -- C++的类型转换
  • 一、C语言中的类型转换
  • 二、C++的强制类型转换
    • 1.static_cast
    • 2.reinterpret_cast
    • 3.const_cast
    • 4.dynamic_cast


一、C语言中的类型转换

void test()
{
	int i = 0;
	//隐式类型转换(意义相近的类型)
	double d = i;
	printf("%d, %.2f\n", i, d);

	int* p = &i;
	//显式的强制类型转换(意义不相近的类型,但是转换后的值有意义)
	int address = (int)p;
	printf("%x, %d\n", p, address);
}

在这里插入图片描述
在这里插入图片描述
比较符号两边也会发生隐式类型转换;
如果pos == 0,这里end被提升成了无符号整型,当end减到0时,再–end,就会成-1,而对于无符号整型来说,-1就是最大的数;
因此程序进入了死循环;

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

(1)兼容c的隐式类型转换和强制类型转换;
(2)期望用户使用c++的显式强制类型转换;

1.static_cast

static_cast用于非多态类型的转换,编译器隐式执行的任意类型转换都可用static_cast,但不能用于两个不相关的类型之间转换;(类似于c的隐式类型转换,转换意义相近的类型)

void test()
{
	double d = 5.35;
	int i = static_cast<int>(d);
	cout << i << endl;
}

2.reinterpret_cast

reinterpret_cast通常用于将一种类型转换为另一种不同的类型;(类似于c的强制类型转换,类型不同但转换后的值有意义)

void test()
{
	double d = 5.35;
	int i = static_cast<int>(d);
	cout << i << endl;

	int* p = reinterpret_cast<int*>(i);
}

3.const_cast

const_cast最常用的就是删除变量的const属性,方便赋值;
c++中的const对象并没有存在常量区,而是存在栈上,所以叫常变量,能够通过这种方式修改

void test()
{
	const int a = 2;
	int* p = const_cast<int*>(&a);
	(*p)++;

	cout << a << endl;
	cout << *p << endl;
}

以上代码的输出结果其实是:
在这里插入图片描述
但是a在实际的存储空间上还是被改变了的;
在这里插入图片描述
原因就在于编译器对于const类型的变量有优化,认为const变量不会被修改;
直接在a初始化的时候就把它放进一个寄存器中,读取的时候不用在内存中取,而是直接去寄存器中取,所以还是2
但是*p实是在内存中取的,所以是3;

给a加上volatitle关键字表示不去优化这个变量;

void test()
{
	volatile const int a = 2;
	int* p = const_cast<int*>(&a);
	(*p)++;

	cout << a << endl;
	cout << *p << endl;
}

在这里插入图片描述
输出结果a就变为3了;

4.dynamic_cast

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

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

注意:
(1)dynamic_cast只能用于父类含有虚函数的类;
(2)dynamic_cast会事先检查转换是否成功,如果能成功就转换,不能就返回0;

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

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


void func(A* pa)
{
	B* pb = (B*)pa;
	pb->_a++;
	pb->_b++;
}

A*是父类指针,可能指向父类对象,也可能指向子类对象;但是指向子类对象无法访问子类独有的成员;
如果使用C中的强制类型转换,会发生越界

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

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


void func(A* pa)
{
	//如果pa指向子类,那么可以转换,转换表达式返回正确的地址
	//如果pa指向父类,那么不可以转换,转换表达式返回nullptr

	B* pb = dynamic_cast<B*>(pa); // 安全的
	if (pb)
	{
		cout << "转换成功" << endl;
		pb->_a++;
		pb->_b++;
		cout << pb->_a << ":" << pb->_b << endl;
	}
	else
	{
		cout << "转换失败" << endl;
		pb->_a++;
		cout << pb->_a << endl;
	}

}

void test()
{
	B b;
	func(&b);
}

使用dynamic_cast转换是安全的;
如果pa指向子类,那么可以转换,转换表达式返回正确的地址;
如果pa指向父类,那么不可以转换,转换表达式返回nullptr;

在这里插入图片描述

例:
在这里插入图片描述
在这里插入图片描述
强制类型转换之后,ptr2指向的地址会改变,变成子类的地址,与dynamic_cast是一样的

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

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

相关文章

只下载rpm包而不安装(用于内网虚拟机使用)

这里写目录标题 问题&#xff1a;解决&#xff1a;1. 安装yum-utils2. 下载rpm包3. 将rpm包拷贝到离线的虚拟机并安装 问题&#xff1a; 公司虚拟机仅使用内网无法通过yum下载依赖&#xff1b; 解决方法之一就是从一台连了公网的虚拟机(NAT) 下载需要的rpm包&#xff0c;然后…

Xcode安装与配置

安装Xcode Xcode需要macOS系统上安装&#xff0c;截止到2020年1月31日&#xff0c;最新版本为11.3.1。你可以选择在苹果开发者网站下载Xcode安装文件或去苹果应用市场安装&#xff0c;无论哪种方式安装Xcode&#xff0c;都需要有一个自己的Apple ID&#xff0c;具体的申请注册流…

unittest 测试框架的使用

文章目录 1. unittest 框架解析2. 批量执行测试脚本1&#xff09;构建测试套件addTest() 方法makeSuite() 方法TestLoader() 方法 2&#xff09;用例的执行顺序3&#xff09;忽略测试用例的执行 3. unittest 断言4. HTML 报告生成5. 异常捕获与错误截图6. 数据驱动1&#xff09…

【项目测试报告】网页版博客系统 + online 好友聊天室

网页版博客系统 online 好友聊天室&#xff08;项目介绍&#xff09; 实现一个网页版的博客系统&#xff0c;提供了一个技术文章论坛&#xff0c;同时也提供了用户之间在线交流的平台。 网页博客系统支持以下核心功能&#xff1a; 用户注册、登录、注销功能&#xff08;登录…

JAVAWeb11-服务器渲染技术 -JSP-02-EL表达式(会使用)

1. EL 表达式介绍 EL 表达式全称&#xff1a;Expression Language&#xff0c;是表达式语言EL 表达式主要是代替 jsp 页面的表达式脚本<%request.getAttribute("xx")%>EL 表达式输出数据时&#xff0c;比 jsp 的表达式脚本简洁EL 表达式基本语法&#xff1a; …

HAL库版FreeRTOS(下)

目录 FreeRTOS 事件标志组FreeRTOS 事件标志组简介FreeRTOS 事件标志组相关API 函数FreeRTOS 事件标志组实验功能设计软件设计下载验证 FreeRTOS 任务通知FreeRTOS 任务通知简介任务通知的优势任务通知的缺点 FreeRTOS 任务通知相关API 函数 FreeRTOS 事件标志组 事件标志组与…

【Leetcode】241. 为运算表达式设计优先级

241. 为运算表达式设计优先级&#xff08;中等&#xff09; 解法一&#xff1a;分治法 对于这道题&#xff0c;加括号其实就是决定运算次序&#xff0c;所以我们可以把加括号转化为&#xff0c;「对于每个运算符号&#xff0c;先执行处理两侧的数学表达式&#xff0c;再处理此…

提高APP安全性的必备加固手段——深度解析代码混淆技术

APP 加固方式 Android APP 加固是优化 APK 安全性的一种方法&#xff0c;常见的加固方式有混淆代码、加壳、数据加密、动态加载等。下面介绍一下 Android APP 加固的具体实现方式。 混淆代码&#xff1a; 使用 ProGuard 工具可以对代码进行混淆&#xff0c;使得反编译出来的代…

makefile语法解析

gcc语法简介 gcc (-c) hello.c world.c -o main-c表示只编译不链接 -o目标文件 此外&#xff0c;还有-I&#xff08;大写的I&#xff09;表示给gcc添加自定义的头文件的路径 -L表示给gcc添加额外的搜索库的路径 -g选项的意义是“生成调试信息&#xff0c;该程序可以被调试器调…

【Java入门合集】第五章抽象类和接口(二)

博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.了解什么是抽象类&#xff0c;什么是接口&#xff1b; 2.掌握抽象类和接口的定义方法&#xff1b; 3.理解接口和抽象类的使用场景&#xff1b; 4.掌握多态的含义和用法&#xff1b; 5.掌握内部类的定义方法和使用…

【Hive实战】Hive元数据存储库数据增多的分析

Hive元数据存储库数据增多的分析 2023年5月8日 文章目录 Hive元数据存储库数据增多的分析问题新增Hive相关的DDL操作创建Hive库库授权到用户 创建Hive表 内部表非分区表表授权到用户一级分区表二级分区表分桶表分桶排序表 查询指令核心表分析表关系图表以库表为主以hive表为主以…

人人都可用的ChatGPT,Edge浏览器-免费ChatGPT保姆级教程!非常详细!

人工智能大浪潮已经来临&#xff0c;对于ChatGPT&#xff0c;我觉得任何一个玩互联网的人&#xff0c;都应该重视起来&#xff0c;用起来。但是国内使用需要解决科学上网、注册、收费等繁琐问题。 所以&#xff0c;今天这篇文章就来推荐一个插件&#xff0c;无需任何繁琐操作&…

第一次省赛团队训练 - BAPC 2022 Pre(DAPC 2022)

B (2). Bubble-bubble Sort [ 提交记录 ] [ 问题 3462 ] 时间限制: 2000MS 空间限制: 256MB 结果评判: 文本对比 正确/提交: 7 (5) / 15 官方标签: 用户标记: 题目描述 Bubbles! As a fanatical supporter of the Bubbles Are Perfect Creatures movement, you have ac…

第8章 未执行缓存的强制清理操作导致显示异常解决方案

1 异常产生原因&#xff1a; 由于未为Role实体定义相就的缓存强制销毁器类&#xff1a;Services.Customers.Caching.RoleCacheEventConsumer,从而导致Services.Events.EventPublisher.PublishAsync<TEvent>(TEvent event)中的 consumers实例为0,如下图所示&#xff1a; 2…

深入理解移动端布局:Viewport与设备像素比

在移动端开发中&#xff0c;了解和掌握不同设备的布局特点是非常重要的。本文将介绍两个关键概念&#xff1a;Viewport 和设备像素比&#xff08;DPR&#xff09;&#xff0c;帮助你更好地理解移动端布局。 一、什么是 Viewport&#xff1f; Viewport 是用户在浏览器中可见的网…

JS知识点(包括原型,原型对象,数据类型,数据类型的检测)

目录 1、JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; 2、基本数据类型和引用数据类型地区别&#xff1a; 3、数据类型检测的方式有哪些: 4、判断数组的方式有那些&#xff1f; 5、null和undefined区别&#xff1a; 6、为什么typeOf null得到object而不是n…

22个提升生产力的工具推荐,稳了

子曰&#xff1a;工欲善其事&#xff0c;必先利其器。 本文给大家推荐22个提高生产力的工具&#xff0c;总有一款符合你的需求。&#x1f604;&#x1f604;&#x1f604; 提高生产效率工具推荐 滴答清单/Todoist文件检索利器&#xff1a;Everything文件管理软件-Allen Explor…

基于SpringBoot的大学生租房系统

背景 大学生租房系统设计的目的是建立一个高效的平台&#xff0c;采用简洁高效的Java语言与Mysql数据库等技术&#xff0c;设计和开发了本大学生租房系统设计。该系统主要实现了用户和房主通过系统注册用户&#xff0c;登录系统后能够编辑自己的个人信息、查看首页&#xff0c…

【电子学会】2023年03月图形化三级 -- 猫猫的儿童节

猫猫的儿童节 儿童节到了&#xff0c;给小猫绘制一个七彩的气球。 1. 准备工作 &#xff08;1&#xff09;保留小猫角色&#xff1b; &#xff08;2&#xff09;选择“Button2”角色&#xff0c;添加文字“开始”&#xff1b; &#xff08;3&#xff09;默认白色背景。 2…

有人抱怨Android找不到工作,有人却收到了好几个Offer~

不知不觉&#xff0c;往年常说的面试黄金季就这样过去了&#xff0c;相信现在很多人都会抱怨说&#xff0c;现在是市场岗位缩水裁员季。有人抱怨&#xff0c;自然也有人喜悦&#xff0c;有失业人群在&#xff0c;自然就业人群也有&#xff0c;有人想找一份合理工作很难&#xf…