【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…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...