【C++类型转换】4种类型转换:static_cast、reinterpret_cast、const_cast、dynamic_cast

news2024/9/21 12:46:43

目录

1. C语言中的类型转换

2.1.类型转换:static_cast

2.2.类型转换:reinterpret_cast

2.3.类型转换:const_cast

2.4.类型转换:dynamic_cast


1. C语言中的类型转换

  1. 隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败(相近类型:(整形和浮点)、(指针和指针))
  2. 显式类型转化:非相近类型强制类型转换
void Test ()
{
     int i = 1;
     // 隐式类型转换
     double d = i;
     printf("%d, %.2f\n" , i, d);
     int* p = &i;
     // 显示的强制类型转换
     int address = (int) p;
     printf("%x, %d\n" , p, address);
}

 c语言隐式类型转换会发生的一些问题

  • 下面代码i和j比较会把i隐式类型转换为unsigned int,和j比较不会小于0死循环
int main()
{
    int i = 5; size_t j = 0;
    while (i >= j)
    {
        i--;
        if (i == -10)
            break;
        cout << i << " ";
    }
    return 0;
}

 所以C++提出了中类型转换来规范

2.1.类型转换:static_cast

static_cast对应的是C语言中的隐式类型转换,支持相近类型的转换,非相近类型编译不通过;

void Test1()
{
    int i = 1;
    // sattic_cast
    double d = static_cast<double>(i);
    printf("%d, %.2f\n", i, d);
}
int main()
{
    Test1();
    return 0;
}

 

 2.2.类型转换:reinterpret_cast

 reinterpret_cast对应的是C语言中的显示类型转换,支持非相近类型的转换

void Test1()
{
    int i = 1;
    // reinterpret_cast
    int* p = &i;
    int address = reinterpret_cast<int>(p);
    printf("%x, %d\n", p, address);
}
int main()
{
    Test1();
    return 0;
}

 2.3.类型转换:const_cast

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

int main()
{
	const int a = 5;
	int* p = const_cast<int*>(&a);
	*p = 10;
	cout << a << endl;
	cout << *p << endl;

	return 0;
}

上面代码执行结果

原因:编译器都被const修饰的变量有优化;不会取内存中取,会直接使用常量5; 

 关键字volatile:不让编译器优化,去内存中取值

 常量区禁止写入,编译好的指令在常量区

volatile const int a = 0;//常量区不能写入,编译好的指令在常量区
int main()
{
	int* p = const_cast<int*>(&a);
	*p = 10;
	cout << a << endl;
	cout << *p << endl;

	return 0;
}

 2.4.类型转换:dynamic_cast

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

要求:

  1.  dynamic_cast只能用于父类含有虚函数的类(必须是多态,因为虚函数表内存了一个判断它是子类还是父类)
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr

 需求:如果pa是指向父类对象,那么不做任何处理,如果pa是指向子类对象,那么请转回子类,并打印子类对象地址

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

class B : public A
{
public:
};
void func(A* pa)//切片
{
	// dynamic_cast--如果pa指向的父类对象,那么则转换不成功,返回nullptr
	// dynamic_cast--如果pa指向的子类对象,那么则转换成功,返回对象指针
	B* pb1 = dynamic_cast<B*>(pa);
	if (pb1 == nullptr)
	{
		cout << "转换失败" << endl;
	}
	else
	{
		cout << "pb1:" << pb1 << endl;
	}
}

int main()
{
	A aa;
	B bb;
	func(&aa);
	func(&bb);
}

 

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

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

相关文章

第9章 无监督学习

系列文章目录 第1章 绪论 第2章 机器学习概述 第3章 线性模型 第4章 前馈神经网络 第5章 卷积神经网络 第6章 循环神经网络 第7章 网络优化与正则化 第8章 注意力机制与外部记忆 第9章 无监督学习 第10章 模型独立的学习方式 第11章 概率图模型 第12章 深度信念网络 第13章 深…

两种形式的import

两种形式 import … 后面只能是模块或包 from … import … from 后面只能是模块或包&#xff0c;import 后面可以是任何变量 总结 可以简单的记成&#xff1a;第一个空只能填模块或包&#xff0c;第二个空填啥都行。 看一个实例 通过from import可以正常都模块 import方式不…

安装head

版本 github地址&#xff1a;https://gitcode.net/mirrors/mobz/elasticsearch-head?utm_sourcecsdn_github_accelerator 下载zip 解压zip得到文件夹elasticsearch-head-master 打开head命令行&#xff0c;依次按命令下载 下载淘宝镜像&#xff1a; npm install -g cnpm -…

程序员需知的9个编程学习官网,建议收藏

毫无疑问&#xff0c;一项技术&#xff0c;最权威的文档一定是它的官方文档&#xff0c;所有的教程、书籍都是直接或者间接在官方相关文档的基础上完成。所以&#xff0c;编程学习&#xff0c;后面最好还是要看官网的。当然&#xff0c;官网大部分都是英文——其实配合一些翻译…

Ubuntu下Petalinux安装流程与常见问题解决

一. 简介 由于近期需要对ZYNQ ARM端做Linux开发测试&#xff0c;需要用到Petalinux工具进行定制&#xff0c;所以本文对Petalinux安装过程进行简要总结&#xff0c;并对安装过程中遇到的一些问题进行解释并解决。 Petalinux是Xilinx公司开发的嵌入式Linux定制软件&#xff0c;…

「C#」异步编程玩法笔记-async、await

C#5.0的时候引入了async和await两个修饰符&#xff0c;成为异步编程的核心关键字。 async 是修饰符&#xff0c;表明方法含有异步操作&#xff0c;但并不是说整个方法是异步的。async修饰的方法会先同步执行到第一处await的地方而后开始异步。 await可以理解为一异步特有的“re…

使用Python制作内马尔的胜利之舞代码版

不知道大家最近有没有被球星内马尔所吸引&#xff0c;反正我是对他的胜利之舞上瘾了。今天&#xff0c;我以程序猿的视角将他的胜利之舞做成代码版的视频。话不多说&#xff0c;先看看最终效果图&#xff1a; 哈哈哈哈&#xff0c;是不是看着还不错的样子。 之前我做过类似的教…

小程序游戏 vs h5游戏,技术优势分别有哪些

从“跳一跳”到“羊了个羊”微信小游戏上线4年时间&#xff0c;除了涌现出不少火爆全网的小游戏之外&#xff0c;也有类似于“动物餐厅”、“口袋奇兵”等游戏得以在此孵化繁荣&#xff0c;凭借着微信强大的社交属性小游戏成为游戏厂商在桌面端、App 端、H5 端之外争夺的另一个…

微软宣布 S2C2F 已被 OpenSSF 采用

开源供应链安全对大多数 IT 领导者来说是个日益严峻的挑战&#xff0c;围绕确保开发人员在构建软件时如何使用和管理开源软件 (OSS) 依赖项的稳健策略至关重要。Microsoft 发布安全供应链消费框架 (S2C2F) 是一个以消费为中心的框架&#xff0c;它使用基于威胁的风险降低方法来…

linux下安装部署es-head插件

es通过程序代码调用es 各种api接口。 es-head查看与显示es状态信息&#xff0c;数据量&#xff0c;具体数据。 1、elasticsearch-head介绍 官方地址: https://github.com/mobz/elasticsearch-head elasticsearch-head 是一款用来管理Elasticsearch集群的第三方插件工具。 e…

用二元泊松模型预测2022年世界杯淘汰赛结果

用二元泊松模型预测2022年世界杯淘汰赛结果 网上有很多文章用双泊松&#xff08;Double Poisson&#xff09;模型来预测世界杯比赛结果。但是双泊松模型有一个严重的缺陷&#xff0c;那就是它假设比赛中两队的比分是条件独立的。而我们都知道&#xff0c;在对抗性比赛中&…

国产API管理神器Eolink也太强了吧

一、研发痛点 什么是API研发管理 API研发管理是包含了API开发管理、开发团队协作、自动化测试、网关以及监控等等API管理全生命周期的一系列管理过程。可以帮助公司实现开发运维一体化&#xff0c;提升开发速度&#xff0c;达到降本增效的目标。 前端痛点 针对前端开发在使…

Metabase学习教程:权限-2

使用集合权限 设置具有权限的集合&#xff0c;以帮助用户组织和共享与其相关的工作。 集合保持问题,仪表板&#xff0c;和模型有条理&#xff0c;容易找到。将集合视为存储我们工作的文件夹是很有帮助的。集合权限授予一群人访问&#xff1a; 查看或编辑保存在集合中的问题、…

激活企业数字化采购价值,智慧采购管理系统助力半导体行业提升采购协同效率

如今&#xff0c;随着国内经济不断发展以及国家对半导体行业的政策扶持&#xff0c;我国半导体行业发展迅速&#xff0c;半导体技术含量与日俱增的同时&#xff0c;也对我国半导体企业的管理效能与管理工具提出了更高的要求。在海外对国内半导体产业发展日益严格的当下&#xf…

Netty篇之如何优雅的关服

强制关服的危害 linux中关服如果我们使用 kill -9 pid号或者在windows中使用 taskkill /f /pid pid号来关服的话&#xff0c;相当于是突然断电的方式&#xff0c;会导致如下几种情况。 缓存中的数据丢失正在进行文件的写操作&#xff0c;没有更新完成&#xff0c;突然退出会…

技术分享 | Redis 集群架构解析

作者&#xff1a;贲绍华 爱可生研发中心工程师&#xff0c;负责项目的需求与维护工作。其他身份&#xff1a;柯基铲屎官。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 一、集群架构的一…

决策树算法中处理噪音点

目录 如何解决&#xff1f;——采用剪枝的方法。 预剪枝 后剪枝 如果训练集中存在噪音点&#xff0c;模型在学习的过程总会将噪音与标签的关系也学习进去&#xff0c;这样就会造成模型的过拟合化&#xff0c;也就是模型在训练集的分类效果很好&#xff0c;在未知数据上处理效…

python快速实现2048小游戏

《2048》是一款比较流行的数字游戏&#xff0c;最早于2014年3月20日发行。原版2048首先在GitHub上发布&#xff0c;原作者是Gabriele Cirulli&#xff0c;后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。 操作指南&#xff1a; 每次…

景区票务系统毕业设计,景区售票系统设计与实现,旅游售票系统毕业设计源码分析

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于java的景区景点预约购票系统&#xff0c;整体使用javaMySql的B/S架构&#xff0c;技术上采用了springboot框架&#xff1b;通过后台添加景区资讯、景点介绍&#xff0c;管理用户订单&#xff1b;用户通过…

Vue怎么通过JSX动态渲染组件

一、明确需求 有一组数组结构如下&#xff1a; const arr [ { tag: van-field }, // 输入框{ tag: van-cell }, // 弹出层{ tag: van-stepper } // 步进器 ] 想通过循环arr&#xff0c;拿到tag渲染对应的组件。 下面我们分析如何写才是最优。 二、进行分析 2.1 v-if走天…