【C++】类型转换方法
本篇博客让我们来见识一下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;

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;

欸,为什么我们取地址之后,修改为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;

2.4 dynamic_cast
该关键字是用于继承中,将一个父类的指针/引用转换为子类对象的指针/引用
之前学习继承的时候,我们了解过
- 向上转型:父类的指针、引用可以直接指向子类对象的指针/引用(这是一个赋值兼容的规则,不需要进行转换)
- 向下转型:反过来之后,可以直接赋值吗?不够安全
dynamic_cast的作用就是判断一个父类指针指向的是不是他的子类
- 如果是,能够成功转换
- 不能则返回0
这个关键字最大的作用,便是可以帮我们判断这个父类指针/引用指向的是否为一个子类对象
class A
{
public:virtual void f() {}
};
class B : public A
{};void fun(A* pa)
{// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0B* 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);
}

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

3.C++强制类型转换的作用
C++希望我们规范强制类型转换的情景,针对性的调用不同的关键字
但是由于它没有强制,在实际情况中用的反而不多
不过需要注意的是,强制类型转换会关闭/挂起正常的类型检查,在强制类型转换之前,我们要仔细检查是否还有别的方法来达到目的。最好是避免使用强制类型转换!
4.RTTI
之前学习智能指针的时候,我们学过一种思路叫RAII
这里的RTTI全称为Run-time Type identification,即运行时类型识别
C++通过下面几种方式来支持RTTI:
- typeid
- decltype
- dyanmic_cast
这个概念只需要了解即可!
相关文章:
【C++】类型转换方法
本篇博客让我们来见识一下C中新增的类型转换方法 文章目录1.C语言中类型转换2.C中的强制类型转换2.1 static_cast2.2 reinterpret_cast2.3 const_castvolatile关键字2.4 dynamic_cast3.C强制类型转换的作用4.RTTI1.C语言中类型转换 在C语言中,类型转换有下面两种形…...
100亿级订单怎么调度,来一个大厂的极品方案
背景 超时处理,是一个很有技术难度的问题。 所以很多的小伙伴,在写简历的时候,喜欢把这个技术难题写在简历里边, 体现自己高超的技术水平。 在40岁老架构师 尼恩的读者交流群(50)中,尼恩经常指导大家 优化简历。 最…...
C++性能白皮书
最近看完了《C性能白皮书》,这本书列出了一些性能优化的思路,不过只是一些指引,没有讲具体细节,我整理出了其中的关键点分享给大家: 硬件篇 作为一个程序员,想要性能优化,最好要了解些硬件&…...
华为OD机试 - 黑板上色 | 机试题算法思路 【2023】
最近更新的博客 华为OD机试 - 简易压缩算法(Python) | 机试题算法思路 【2023】 华为OD机试题 - 获取最大软件版本号(JavaScript) 华为OD机试 - 猜字谜(Python) | 机试题+算法思路 【2023】 华为OD机试 - 删除指定目录(Python) | 机试题算法思路 【2023】 华为OD机试 …...
如何在六秒内吸引观众的注意力
根据《2022国民专注力洞察报告》显示,当代人的连续专注时长,已经从2000年的12秒,下降到了现在的8秒。对于这个事实你可能难以相信,实际上这意味着,大多数互联网用户跳到一些页面上时,可能眼皮都不眨一下就离…...
FreeRTOS与UCOSIII任务状态对比
FreeRTOS任务状态 1、运行态 正在运行的任务,正在使用处理器的任务。 单核处理器中任何时候都有且只有一个任务处于运行态。 2、就绪态 已经准备就绪(非阻塞或挂起),可以立即运行但还没有运行的任务。 正在等待比自己高优先级…...
小程序 npm sill idealTree buildDeps 安装一直没反应
目录 一、问题 二、解决 1、删除.npmsrc 、清除缓存 2、更换镜像源 3、最终检测 一、问题 记录:今天npm 一直安装不成功 显示:sill idealTree buildDeps 我的版本: 我百度到换镜像源安装方法,但我尝试后,依然…...
GPT系列详解:初代GPT
本文详细解读了OpenAI公司在2018年6月发布的论文《Improving Language Understanding by Generative Pre-Training》,它其中介绍的算法也就是后来人们说的GPT。本文借鉴了李沐的这个视频,感兴趣的同学可以移步观看大神的讲解。 目录引言GPT方法无监督预训…...
为什么要使用数据库
数据保存在内存优点:存取速度快缺点:数据不能永久保存数据保存在文件优点:数据永久保存缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便数据保存在数据库1)数据永久保存2&a…...
【单目标优化算法】海鸥优化算法(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
筑基六层 —— 整型提升及实用调式技巧
目录 一.修炼必备 二. 整型提升 三.实用调式技巧 一.修炼必备 1.入门必备:VS2019社区版,下载地址:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武器:印象笔记/有道云笔记 3.修炼秘籍&…...
后端前端文件传输2中传出模式
base64文件传输 app.route(/download, methods[get]) def hello_as(): # 数据 id request.args.get("id") cur g.db.cursor() cur.execute(fselect name,grade,commentNum,cityName,sceneryThemeName from dataList where cityId? , (id,)) …...
【ZOJ 1067】Color Me Less 题解(vector+开方)
问题 颜色缩减是从一组离散颜色到较小颜色的映射。这个问题的解决方案需要在标准的24位RGB颜色空间中执行这样的映射。输入由十六个RGB颜色值的目标集合和要映射到目标集合中最接近的颜色的任意RGB颜色集合组成。为了我们的目的,RGB颜色被定义为有序三元组ÿ…...
凌恩生物经典文章:孟德尔诞辰200周年,Nature Genetics礼献豌豆高质量精细图谱
本期为大家分享的文章是2022年发表在《Nature Genetics》上的一篇文章“Improved pea reference genome and pan-genome highlight genomic features and evolutionary characteristics”,作者通过结合三代pacbio测序、染色体构象捕获(Hi-C)测…...
进程间通信(二)/共享内存
⭐前言:在前面的博文中分析了什么的进程间通信和进程间通信的方式之一:管道(匿名管道和命名管道)。接下来分析第二种方式:共享内存。 要实现进程间通信,其前提是让不同进程之间看到同一份资源。所谓共享内存…...
电路模型和电路定律——“电路分析”
各位CSDN的uu们你们好呀,今天小雅兰的内容是我这学期的专业课噢,首先就学习了电路模型和电路定律,包括电路和电路模型、电流和电压的参考方向、电功率和能量、电路元件、电阻元件、电压源和电流源、基尔霍夫定律。那么现在,就让我…...
软件工程 | 第一章:软件工程学概述
软件工程学概述一、前言二、软件危机1.典型表现2.产生原因3.消除危机途径三、软件工程1.概述2.软件本质特征3.软件工程基本原理4.软件工程方法学1️⃣传统方法学2️⃣面向对象方法学四、软件生命周期五、结语一、前言 本文将讲述软件工程导论的第一章相关知识点,主…...
前端开发页面HEAD作用
文档类型 为每个 HTML 页面的第一行添加标准模式(standard mode)的声明, 这样能够确保在每个浏览器中拥有一致的表现。 <!DOCTYPE html> 语言属性 为什么使用 lang="zh-cmn-Hans" 而不是我们通常写的 lang="zh-CN" 呢? 请参考知乎上的讨论: …...
CSS开发技巧——行为技巧
CSS开发技巧——行为技巧 使用overflow-scrolling支持弹性滚动 iOS页面非body元素的滚动操作会非常卡(Android不会出现此情况),通过overflow-scrolling:touch调用Safari原生滚动来支持弹性滚动,增加页面滚动的流畅度 场景:iOS页面滚动 使用t…...
PX4之代码结构
PX4开源飞控是目前主流的开源飞控项目,被很多公司作为飞控开发的参考。也广泛被用于现在流行的evtol验证机的飞控,进行初步的飞行验证。可能大多数AAM以及UAM都离不开PX4。 项目代码可以从github下载 $ git clone --recursive GitHub - PX4/PX4-Autopil…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...
使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
