C++_类型转换

news2024/10/6 14:25:35

文章目录

  • 学习目标:
    • 1.static_cast
    • 2. reinterpret_cast
    • 3.const_cast
    • 4. dynamic_cast
  • 学习过程
    • 1.static_cast
    • 2. reinterpret_cast
    • 3.const_cast
    • 在这里插入图片描述
    • 4. dynamic_cast

学习目标:

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

1.static_cast

2. reinterpret_cast

3.const_cast

4. dynamic_cast


学习过程

类型转换是我们日常学习和写代码总会遇见的事件,在学习C语言时,我们就经常会碰到隐式类型转换,对于一些系统接口函数,我们又需要显示类型转换。 对于这些类型转换,显示的还好些,隐式类型的转换就有些麻烦,因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的
转化风格。

1.static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。
所谓相关就是像double、int、long int 这些类型就是互相相关类型。
不相关就是像指针,int 等类型就是互相不相关类型。

使用static_cast的场景一般是在会发生隐式类型转换的时候。

int main()
{
	double a = 10.12;
	int i = static_cast<int> (a);
	std::cout << i << std::endl;
	return 0;
}

在这里插入图片描述

2. reinterpret_cast

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

int main()
{
	int i = 10;
	int* pi = reinterpret_cast<int*> (10);
	std::cout << pi << std::endl;
	return 0;
}

在这里插入图片描述


3.const_cast

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

int main()
{
	const int i = 20;
	int* p = const_cast<int*> (&i);
	*p = 13; //*p修改数据, i的数据是否修改了呢? 
	std::cout << i << std::endl; 
	return 0;
}

在这里插入图片描述
这里我们看到打印出来的i的值并没有随着*p的赋值变为13,这是否说明我们的i的值并没有没修改呢?
实际上这是因为编译器的优化导致的,由于i为const属性,所以编译器在打印i时,直接将早已被保存在寄存器的i的初始值10进行打印了,并没有去访问内存。 (在之前我们学习多线程也遇到过这种情况,我们是使用volatile关键字来解决的)

int main()
{
	//const int i = 20;
	volatile const int i = 20;
	int* p = const_cast<int*> (&i);
	*p = 13;
	std::cout << i << std::endl;

	return 0;
}

在这里插入图片描述

4. dynamic_cast

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

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

对于向上转型,我们不需要使用dynamic_cast进行转换,因为它们由于继承的切片机制,他们在赋值上是允许的。
这里主要讨论向下转型,为什么说用dynamic_cast转型是安全的? 因为如果是向下转型,从内存来看,如果父类对象指针/引用访问到子类对象自有的成员,必然会发生越界访问的问题。 所以如果使用dynamic_cast进行转换,识别到是向下转型,就会返回0,这就避免了越界访问的风险。

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

void fun(A* pa)
{
	// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
	B* pb1 = static_cast<B*>(pa);
	B* pb2 = dynamic_cast<B*>(pa);
	std::cout << "pb1:" << pb1 << std::endl;
	std::cout << "pb2:" << pb2 << std::endl;
}
int main()
{
	A a;
	B b;
	fun(&a);
	std::cout << std::endl;
	fun(&b);
	return 0;
}

在这里插入图片描述


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

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

相关文章

黑马程序员Linux简单入门学习笔记

Linux介绍 内核提供系统最核心的功能&#xff0c;如: 调度CPU、调度内存、调度文件系统、调度网络通讯、调度等系统级应用程序&#xff0c;可以理解为出厂自带程序&#xff0c;可供用户快速上手操作系统&#xff0c;如:文件管理器、任务管理器、图片查看、音乐播放等 目录结构 …

在PostgreSQL中如何实现递归查询,例如使用WITH RECURSIVE构建层次结构数据?

文章目录 解决方案使用WITH RECURSIVE进行递归查询示例代码 总结 在PostgreSQL中&#xff0c;递归查询是一种非常强大的工具&#xff0c;它可以用来查询具有层次结构或树形结构的数据。例如&#xff0c;你可能会在员工-经理关系、目录结构或组织结构图中遇到这样的数据。为了处…

*Linux系统的进程和计划任务管理

目录 一、查看进程 1、程序和进程的关系 *2、ps查看静态进程信息 1&#xff09;ps aux 2&#xff09;ps -elf *3、top查看动态进程信息 4、pgrep查看进程信息 5、pstree查看进程树 二、控制进程 1、进程启动方式 2、进程的前后台调度 3、终止进程的运行 三、计划任…

VSCode搭建内核源码阅读开发环境

0. 参考链接 使用VSCode进行linux内核代码阅读和开发_vscode阅读linux内核-CSDN博客 1. 搭建Linux内核源码阅读环境 现状&#xff0c;Linux内核源码比较庞大文件非常多&#xff0c;其中又包含的众多的宏定义开关配置选项&#xff0c;这使得阅读内核源代码称为一件头疼的事。 …

Android AIDL接口

一.AlDI接口简介 AIDL&#xff08;Android Interface Definition Language&#xff09;是一种 IDL 语言&#xff0c;用于生成可以在 Android 设备上两个进程之间进行进程间通信&#xff08;IPC&#xff09;的代码。 通过 AIDL&#xff0c;可以在一个进程中获取另一个进程的数据…

Go源码--Strings库

1. 简介 strings库 存储了 一些针对 字符串的具体操作 其 代码短小精悍 可以学习到很多编程的思路 尤其是 涉及到字符串使用性能的方面&#xff0c;其源码库有好多的优秀案例可以学习。向强者对齐不一定成为强者&#xff0c;但向弱者对齐一定变为弱者。 介绍思路是先介绍 stri…

.net6项目模板

1.集成log4net 安装依赖包&#xff1a; 安装扩展依赖即可&#xff0c;已经包含了log4net依赖&#xff1a; Microsoft.Extensions.Logging.Log4Net.AspNetCore 添加日志配置文件&#xff1a; 日志配置文件属性设置为始终复制&#xff1a; 注入服务&#xff1a; #region 注入…

React【Day4】

路由快速上手 1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候&#xff0c;path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 …

软件设计师软考中项学习(二)之计算机系统基础知识

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 学习目标学习内容学习笔记学习总结 学习目标 计算机系统硬件基本组成 中央处理…

「51媒体」新闻媒体邀约如何进行媒体宣传(方法)

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 新闻媒体邀约进行媒体宣传是一个策略性的过程&#xff0c;旨在吸引媒体的注意力并促使其对特定事件、产品发布或企业活动进行报道。以下是一些关键步骤和策略&#xff1a; 制定媒体传播方…

Advanced RAG 04:重排序(Re-ranking)技术探讨

编者按&#xff1a;重排序&#xff08;Re-ranking&#xff09;技术在检索增强生成&#xff08;Retrieval Augmented Generation&#xff0c;RAG&#xff09;系统中扮演着关键角色。通过对检索到的上下文进行筛选和排序&#xff0c;可以提高 RAG 系统的有效性和准确性&#xff0…

苍穹外卖学习笔记(4.套餐管理,店铺营业状态设置)

目录 一、Redis1、redis在java中的运用 二、店铺营业状态设置1、需求分析设计2、代码设计3、测试 三、套餐管理1、需求设计分析2、代码设计3、测试 一、Redis 具体的redis基本操作就不多再介绍&#xff0c;本节主要学习redis在java中的运用。 1、redis在java中的运用 具体…

Java 多线程加法求和

Java 多线程加法求和 代码 先上代码再上解析&#xff1a; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger;public class Sum implements …

基于人工智能的机动车号牌检测与推理系统v1.0

基于人工智能的机动车号牌检测与推理系统v1.0代码重构与实现。 目前整合3中现有算法&#xff0c;并完成阶段性改造&#xff0c;包括【传统方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;SVM推理字符】、【YOLO方法检测车牌&#xff0c;CNN推理字符】&…

ADSP-21479的开发详解十(用CCES做Flash的编程)

硬件准备 ADSP-21479EVB开发板&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器&#xff1a; 产品链接&#xff1a;https://item.taobao.com/item.htm?id38007…

墨子web3实时周报

蚂蚁集团Web3研发进展与布局 国内Web3赛道的领军企业——蚂蚁集团&#xff0c;凭借其在前沿科技领域的深耕不辍&#xff0c;已在Web3技术研发疆域缔造了卓越战绩。特别是在引领行业革新的关键时刻&#xff0c;集团于今年四月末震撼推出了颠覆性的Web3全套解决方案&#xff0c;…

Hive基础3

一、表的分区 大数据开发数据量较大&#xff0c;在进行数据查询计算时&#xff0c;需要对数据进行拆分&#xff0c;提升的查询速度 1-1 单个分区 单个分区是创建单个目录 -- 创建表指定分区&#xff0c;对原始数据进行分区保存 create table new_tb_user(id int,name string,ag…

通过实例学C#之序列化与反序列化XmlSerializer类

简介 可以将类序列化成xml文件&#xff0c;或者将xml文件反序列化成类对象&#xff0c;一般用于保存或加载项目参数。 构造函数 XmlSerializer() 不使用函数创建一个xmlSerializer对象。 XmlSerializer(Type type) 使用type对象创建一个xmlSerializer对象&#xff0c;注意&…

[阅读笔记23][JAM]JOINTLY TRAINING LARGE AUTOREGRESSIVE MULTIMODAL MODELS

这篇论文是24年1月发表的&#xff0c;然后是基于的RA-CM3和CM3Leon这两篇论文。它所提出的JAM结构系统地融合了现有的文本模型和图像生成模型。 主要有两点贡献&#xff0c;第一点是提出了融合两个模型的方法&#xff0c;第二点是为混合模型精心设计的指令微调策略。 下图是一个…

【Java笔记】第4章:深入学习循环结构

前言1. 循环的理解2. while循环3. do...while循环4. for循环5. 循环的控制语句6. 循环的嵌套结语 ↓ 上期回顾: 【Java笔记】第3章&#xff1a;深入学习分支结构 个人主页&#xff1a;C_GUIQU 归属专栏&#xff1a;【Java学习】 ↑ 前言 各位小伙伴大家好&#xff01;上期小编…