【C++】类型转换方法

news2025/2/25 0:28:33

本篇博客让我们来见识一下C++中新增的类型转换方法

文章目录

  • 1.C语言中类型转换
  • 2.C++中的强制类型转换
    • 2.1 static_cast
    • 2.2 reinterpret_cast
    • 2.3 const_cast
      • volatile关键字
    • 2.4 dynamic_cast
  • 3.C++强制类型转换的作用
  • 4.RTTI

1.C语言中类型转换

在C语言中,类型转换有下面两种形式

  • 隐式类型转换
  • 显示强制类型转换int a=(int)'c'

这两种方式想必各位都很熟悉了,但隐式类型转换在一些场景里面会出现问题

void insert(size_t pos,char c)
{
	int end=10;
	while(end>=pos)
	{
		end--;
	}
	//...
}

上面的代码中,end是int类型,当进行比较的时候,end会-1直到小于pos

如果pos=0,问题就来了!

隐式类型转换会让end在比较的时候被转换为size_t无符号整型,而在无符号整型中,-1是一个非常大的正数,从而导致这个函数进入死循环!


  • 隐式类型转换可能会丢失数据的精度
  • 显示类型转换的写法都一样,导致不能很好的区分情况

C++委员会也是认识到了这里的问题,当产生隐式类型转换的时候,难以跟踪错误的来源,于是开发了下面的新的类型转换方式

不过,因为C++兼容C语言,所以C中的转换方式依旧支持


2.C++中的强制类型转换

C++中新增了下面四种明明的强制类型转换操作符

static_cast、reinterpret_cast、const_cast、dynamic_cast

2.1 static_cast

这个关键字是用于相近类型之间的转换的,比如double和int,char和int之间

	double d = 11.4;
	int a1 = static_cast<int>(d);//相近类型的转换
	char ch = 'a';
	int a2 = static_cast<int>(ch);
	cout << a1 << endl;
	cout << a2 << endl;

image-20221020162052557

2.2 reinterpret_cast

这个关键字用于不相近类型之间的转换,比如指针转成int

	int* p = &a1;
	//int x = static_cast<int>(p);//报错:类型转换无效
	int x = reinterpret_cast<int>(p);//非相近类型中的转换
	cout << x << endl;

打印的结果如下(每次运行都不一样)

2029408

2.3 const_cast

如同其名,这个关键字的作用是取消一个变量的const属性

const int c1 = 3;//这里定义的变量是在栈上的,可以间接修改
int* ptr1 = const_cast<int*>(&c1);//取消const权限
*ptr1 = 4;
cout << c1 << endl;//修改了地址之后没有变化
cout << *ptr1 << endl;

image-20221020162259828

欸,为什么我们取地址之后,修改为4了,变量c1本身不会变化呢?

这是因为编译器做了一些优化,把c1放到了某个地方,取的时候并没有直接去内存里面取

volatile关键字

这里我们可以使用volatile关键字修饰变量,要求每一次都必须要去内存中取

//volatile关键字,每次访问c都去内存中取,屏蔽编译器优化
volatile const int c2 = 3;
int* ptr2 = const_cast<int*>(&c2);//取消const权限
*ptr2 = 4;
cout << "volatitle:  ";
cout << c2 << endl;
cout << *ptr2 << endl;

image-20221020162443380

2.4 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);
	cout << "pb1:" << pb1 << endl;
	if (pb2)
	{
		cout << "转换成功!pb2:" << pb2 << endl;
	}
	else
	{
		cout << "转换失败!pb2:" << pb2 << endl;
	}
	
}

void test2()
{
	A a;
	B b;
	fun(&a);
	fun(&b);
}

image-20221020163245904

这里有个要求,那便是父类中必须要有虚函数(多态),否则无法成功转换

image-20221020163349806

3.C++强制类型转换的作用

C++希望我们规范强制类型转换的情景,针对性的调用不同的关键字

但是由于它没有强制,在实际情况中用的反而不多

不过需要注意的是,强制类型转换会关闭/挂起正常的类型检查,在强制类型转换之前,我们要仔细检查是否还有别的方法来达到目的。最好是避免使用强制类型转换!

4.RTTI

之前学习智能指针的时候,我们学过一种思路叫RAII

这里的RTTI全称为Run-time Type identification,即运行时类型识别

C++通过下面几种方式来支持RTTI:

  • typeid
  • decltype
  • dyanmic_cast

这个概念只需要了解即可!

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

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

相关文章

音视频基础之ffmpeg命令实战一

一&#xff1a;概念区别 ffmpeg/ffmplay/ffprobe区别 ◼ffmpeg: Hyper fast Audio and Video encoder 超快音视频编码器&#xff08;类似爱剪辑&#xff09; 如&#xff1a;把10分钟的视频剪辑为2分钟。 ◼ffplay: Simple media player简单媒体播放器 ◼ffprobe: Simple multi…

0202插入删除-算法第四版红黑树-红黑树-数据结构和算法(Java)

文章目录4 插入4.1 序4.2 向单个2-结点插入新键4.3 向树底部的2-结点插入新键4.4 向一棵双键树&#xff08;3-结点&#xff09;中插入新键4.5 颜色调整4.6 根结点总是黑色4.7 向树底部的3-结点插入新键4.8 将红链接在树中向上传递4.9 实现5 删除5.1 删除最小键5.2 删除6 有序性…

ASE4N65SE-ASEMI高压MOS管ASE4N65SE

编辑-Z ASE4N65SE在TO-220F封装里的静态漏极源导通电阻&#xff08;RDS(ON)&#xff09;为2.5Ω&#xff0c;是一款N沟道高压MOS管。ASE4N65SE的最大脉冲正向电流ISM为16A&#xff0c;零栅极电压漏极电流(IDSS)为10uA&#xff0c;其工作时耐温度范围为-55~150摄氏度。ASE4N65S…

面试官:说说react的渲染过程

hello&#xff0c;这里是潇晨&#xff0c;大家在面试的过程中有没有遇到过一些和react相关的问题呢&#xff0c;比如面试官让你说说react渲染的过程&#xff0c;这到题目比较开放&#xff0c;也比较考验大家对react渲染原理以及源码的整体架构的理解。 整体流程&#xff1a; r…

AcWing语法基础课笔记 第八章 C++ STL 第九章 位运算与常用库函数

第八章 C STL 第八章 C STL 1.#include <vector> 2.#include<queue> 3.#include <stack> 4.#include <deque> 5.#include <set> 6.#include<map> 第九章 位运算与常用库函数 STL是提高C编写效率的一个利器。 ——闫…

文献阅读笔记 # 区块链在软件供应链管理中的应用探索

崔宝江, 宋绪言. 区块链在软件供应链管理中的应用探索[J]. 保密科学技术, 2019(5): 41-44.主要作者来自北京邮电大学网络空间安全学院 移动互联网安全技术国家工程实验室&#xff1b; 摘要 探索用区块链技术保障软件供应链安全 1 引言 略。 2 软件供应链面临的安全风险 一…

网络协议(一)应用层(自定制协议、HTTP协议)

目录 应用层&#xff1a;负责应用程序之间的数据沟通 一、自定制协议&#xff08;私有协议&#xff09; 二、HTTP协议 1&#xff09;、请求行解析&#xff1a;GET /index.html HTTP/1.1 第一部分&#xff1a;请求方法&#xff1a;多种多样&#xff0c;描述不同的请求目的 …

吐血整理的网络工程师必懂的26个技术名词,自查一下看看自己知道多少 ?

在做网络工程师的工作时候&#xff0c;虽说那些晦涩难懂的英语以及技术名词很难记 比如我这个英语从不及格的小乐色&#xff0c;但是你会发现很多都会用到&#xff0c;所以多多少少还是要储备一些在脑子里&#xff0c;有点印象就OK了。查起来也方便不是&#xff01;那么今天咱…

基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计(二)

第 3 章 嵌入式软件系统移植本课题中嵌入式系统正常工作的前提是嵌入式软件系统完整且能正常工作&#xff0c; 以便为之后的软件开发提供一个能够正常工作的平台。引导程序 PMON 需要完成 内核引导&#xff0c;嵌入式 Linux 内核需要具有完备的功能且能够正常使用&#xff0c;根…

2023年 Android Studio Unable to find bundled Java version 解决方法

学习flutter过程中发现 Unable to find bundled Java version 错误搜索网上的解决方案都不对最后在 b站 https://www.bilibili.com/video/BV1S4411E7LY?p17&vd_sourced7cf0e2cd70b3cc57314d2efcb598c3d 教程的课件中找到了解决方哦 我的flutter版本 C:\Users\Ken>flu…

MQTT传输JSON数据实例

想跑一个用MQTT传输JSON的实例&#xff0c;上网找了一下开源代码&#xff0c;找到一个比较合适的&#xff1a;https://blog.csdn.net/ktigerhero3/article/details/107178252&#xff0c;程序源码直接用这个就可以&#xff0c;然后过程中需要进行一下环境的配置&#xff0c;本篇…

本地事务详解

1、事务的基本性质 数据库事务的几个特性&#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation) 和持久性(Durabilily)&#xff0c;简称就是 ACID&#xff1b;  原子性&#xff1a;一系列的操作整体不可拆分&#xff0c;要么同时成功&#x…

【Optional】告别丑陋判空,使用Optional类

一、概述 当项目中充斥着大量的、丑陋的判空语句&#xff0c;如下&#xff1a; if (user ! null) {Address address user.getAddress();if (address ! null) {Country country address.getCountry();if (country ! null) {String isocode country.getIsocode();if (isocod…

ksycopg2连接人大金仓数据库报错ksycopg2._ksycopg问题解决

一句话解决 ksycopg2目前仅支持python2.7/3.5&#xff0c;若版本不同&#xff0c;则会发生报错&#xff1a; 替换ksycopg2为psycopg2即可&#xff1a; pip install psycopg2 测试&#xff1a; import psycopg2conn psycopg2.connect(host"xxx.xxx.xxx.xxx", por…

average_precision_score()函数----计算过程与原理详解

最近在复现论文时发现作者使用了 sklearn.metrics 库中的 average_precision_score() 函数用来对分类模型进行评价。 看了很多博文都未明白其原理与作用&#xff0c;看了sklean官方文档也未明白&#xff0c;直至在google上找到这篇文章Evaluating Object Detection Models Usi…

【SpringBoot 自动配置】-EnableAutoConfiguration 注解

【SpringBoot 自动配置】-EnableAutoConfiguration 注解 续接上回 【Spring Boot 原理分析】- 自动配置 与【SpringBoot 自动配置】- Enable*注解 ,在前面笔者分析了在 SpringBoot 自动装配中的最重要的两个注解类&#xff0c; Condition 与 EnableAutoConfiguration 哎~说到…

从0到1搭建大数据平台之监控

大家好&#xff0c;我是脚丫先生 (o^^o) 大数据平台设计中&#xff0c;监控系统尤为重要。 它时刻关乎大数据开发人员的幸福感。 试想如果半夜三更&#xff0c;被电话吵醒解决集群故障问题&#xff0c;那是多么的痛苦&#xff01;&#xff01;&#xff01; 但是不加班是不可…

shiro总结

0x00 前言 此篇作为shiro总结篇&#xff0c;用于查漏补缺。 利用工具推荐&#xff1a;https://github.com/j1anFen/shiro_attack 0x01 反序列化 1.shiro 124 shiro 124&#xff0c;因为AES加密秘钥硬编码导致反序列化漏洞&#xff0c;124修复 Java 代码审计——shiro 1.2…

React 虚拟DOM的前世今生

引文 通过本文你将了解到 什么是虚拟DOM&#xff1f;虚拟DOM有什么优势&#xff1f;React的虚拟Dom是如何实现的&#xff1f;React是如何将虚拟Dom转变为真实Dom&#xff1f; 一、前言 要了解虚拟DOM&#xff0c;我们先明确一下DOM的概念。 根据MDN的说法&#xff1a; 文档…

Win10关闭自动更新

Win10关闭自动更新第一步&#xff1a;修改电脑系统时间第二步&#xff0c;设置自动更新时间第三步&#xff1a;再次修改系统时间为正确时间因为国内使用的操作系统&#xff0c;很多‍是非正版的系统&#xff0c;如果更新了系统&#xff0c;很容易造成电脑蓝屏&#xff0c;系统运…