C++类型转换

【LaTex】3.5 数据分析 简述了LaTex柱状图、饼图、折线图的画法。 阅读详情

目录

一、C语言中的类型转换

二、C++强制类型转换

2.1 static_cast 

2.2 reinterpret_cast 

2.3 const_cast

2.4 dynamic_cast 

三、RTTI


一、C语言中的类型转换

在 C 语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与
接收返回值类型不一致时,就需要发生类型转化 , 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语言的转换格式非常简单,但是其有不少的缺点:

  • 隐式类型转化有些情况可能会出现问题:出现数据精度丢失。
  • 显示类型转化将所有情况混合在一起,代码不够清晰。

下面举一个C语言编写顺序表中的坑:

在insert函数中,我们在 i 位置进行插入数据。

//在i位置插入数据
void Insert(int* arr, size_t& arr_size, size_t i, int val)
{
	int end = arr_size - 1;
	while (end >= i)
	{
		arr[end + 1] = arr[end];
		end--;
	}
	arr[i] = val;
	arr_size++;
}

void test01()
{
	//大小为10的int数组
	int* arr = (int*)malloc(sizeof(int) * 10);
	size_t arr_size = 5;
	//初始化数组  
	arr[0] = 1,arr[1] = 2,arr[2] = 3,arr[3] = 4,arr[4] = 5;

	//插入数据
	Insert(arr, arr_size, 0, 70);
    //打印数组
	for (int i = 0; i < arr_size; i++)
		printf("%d ", arr[i]);
}

当我们运行代码,程序便出现了运行超时,即死循环。

原因:

        因为当我们在0位置插入数据的时候,end-- 移动数据后会等于-1,当 end== -1时,进行end >= i 判断时,因为 i 是size_t 类型,所以end会隐式类型转化为 size_t 类型,而size_t 类型的 -1 为全1,是无符号数的最大值,则会进行死循环。

类似这样的坑在C语言类型中经常出现。

因此C++提出了自己的类型转化风格,因为C++要兼容C语言,所以C++中还是可以使用C语言的转化风格。

二、C++强制类型转换

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

2.1 static_cast 

使用static_cast用于费多态类型的转换,编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。

2.2 reinterpret_cast 

这是一种比较底层的类型转换方式,它可以将一个指针或引用类型转换为任意其他指针或引用类型, 甚至完全不相关的类型。这种转换主要用于特殊场景,比如处理底层的二进制数据或进行某些底层结构的转换。但是,由于它的风险较高,使用时需要谨慎。

 

2.3 const_cast

const_cast最常用的用途就是删除变量的const 属性,方便赋值。
const 变量称之为常变量,其本质还是存放在栈上,虽然其被const 修饰,但是还是可以通过获取其地址对其进行修改。
接下来我们来看看一段程序,并分析其运行结果:

  原因分析:

        a被const修饰,则编译器会认为其不会被修改,则会将其加载至寄存器中,当我们使用指针p获取a的地址时,则会去内存中取出a的地址,赋值给a。当我们解引用修改a地址处的值时,a内存中的值就会被修改;而让我们直接打印a的值时,这是一种读操作,编译器会直接回去寄存器中取出a的值,而不是内存中,则打印出2;当我们使用p解引用则会去内存中取出a的值,则会打印3。

接下来我们使用监视窗口来看看:

        当我们使用监视窗口时,会重新创建一个进程,该进程在获取数据时则会去内存中读取,则读取到的a值是3.

我们可以使用 volatile关键字 修改const int a 让编译器不进行优化。

其实也可以使用(int*)进行强制转换。

此种const情况,使用reinterpret_cast也不行,必须使用const_cast。

2.4 dynamic_cast 

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

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

注意:

  1. dynamic_cast只能用于父类含有虚函数的类

  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

在C++中,天然支持子类向父类的转换(不需要转换,赋值兼容规则)。

首先我们要明确,父类是无论如何不能转为子类的。

而指针和引用是要允许进行转换的,因为父类指针可以指向父类也可以指向子类。

具体看下面这个例子,pa 指针可能指向父类也可能指向子类。

class A
{
public:
    virtual void f(){}
	int _a = 0;
};

class B : public A
{
public:
	int _b;
};

// pa 可能指向父类也可能指向子类
void fun(A* pa)
{
    //函数体……
}

void test06()
{
	A aa;
	B bb;
	fun(&aa);
	fun(&bb);
}

当 pa 指向父类时,我们将其强行转化为子类的指针,该指针则会指向非对象的空间,出现越界的风险。

 如果 pa 指向子类对象,我们是无法访问到子类的成员的。

 此时我们进行要将pa转换为子类指针才能进行访问:

 通过以上例子的分析,我们得出两个痛点:

  1. 当指针指向父类对象时,我们不能将其转换为子类指针,要不然会出现越界。
  2. 当指针指向子类对象时,我们要将其转换为子类指针,才能访问到子类的成员。

而dynamic_cast关键字就解决了以上两个痛点:

dynamic_cast的作用是将父类对象的指针(引用)向子类对象指针(引用)进行转换;如果当前指针指向父类,则其不能将转换为子类指针,如果当前指针指向子类对象,则其可以转换为子类指针。

接着,我们就可以使用dynamic_cast关键字将以上代码进行改写了。

 

简而言之,dynamic_cast就是能帮我们区分当前指针指向父类还是子类。
注意:
        
         dynamic_cast 只能用于 父类 +虚函数的结构。即多态类型,没有虚函数编译直接会报错。
而强制类型转换是对虚函数是没有要求,可以直接进行转换的。 
C++中的强制类型转换兼容了C语言中的隐式类型转换和强制类型转换,C++规范了类型转换,static_cast(隐式类型转换)、reinterpret_cast(强制类型转换)、const_cast(去const属性)、dynamic_cast(继承关系的转换)
C语言中的类型转换主要依赖于强制类型转换操作符(如(int)、(double)等),这种转换是基于编译器的原始方式,没有类型检查,容易出现潜在的错误。而C++的四种强制类型转换方式提供了更严格的类型检查和错误处理机制,减少了类型转换的潜在风险。

三、RTTI

RTTI : Run-time Type identifification 的简称,即:运行时类型识别。

C++通过以下方式来支持RTTI:

  1. typeid运算符      ——  (获取对象类型字符串)

  2. dynamic_cast运算符     —— (继承关系) 

  3. decltype  ——  (推导对象类型用于定义另一个对象)

 

万字长文:YOLOv5+RK3588 NPU多线程加速全攻略——从理论到部署的终极优化 RK3588 NPU多线程加速优化教程摘要 本教程深入讲解了如何利用线程池技术优化RK3588 NPU上的YOLO目标检测模型推理性能。RK3588内置3个NPU核心,理论算力达6TOPS,为多线程优化提供了硬件基础。教程详细解析了线程池的核心组件(任务队列、工作线程、同步机制)和实现架构,包括类设计、初始化流程、工作线程逻辑(任务获取、NPU推理、结果存储三个阶段)以及任务提交/获取机制。通过预分配模型实例、线程绑定、流量控制等优化手段,实现了从单线程28FPS到多线程120FPS的显著性能提升,为边缘A 阅读详情

相关推荐

墨刀原型设计工具操作使用指南及实践操作

该指南通过异常场景处理、像素级参数说明、复杂交互示例,覆盖了墨刀操作的全细节,适合从新手到资深用户的进阶学习。结合 PlantUML 思维导图的层级化展示,可快速定位具体功能的操作要点与问题解决方法,真正实现 “照指南即可操作” 的实用价值。

hy行者勇哥的博客 4946

C+的RTTI机制

RTTI特性是C++语言加入较晚的特性之一。和其他语言(比如JAVA)相比,C++的RTTI能力算是非常差的。这与C++的设计要求应该有重要的关系:性能。没错,性能的因素使得C++的很多地方不能称的上完美,但是也正因为如此,在高级通用语言里面,只有C能和C++的性能可以相提并论。 1:typeid的研究 在C++中,似乎与RTTI相关的只有一个东西,就是dynamic_cast,本来我认为typeid是RTTI的一部分,但是我的实验表明,并非如此。typeid的操作是在编译时期就已经决定的了。下面的代码可

weixin_45596153的博客 486

MAX96712在车载摄像头系统中的带宽分配与传输能力计算解析

在计算摄像头带宽与传输接口的关系时,需要考虑视频流的像素分辨率、帧率、颜色深度等因素。以 MAX96712 这种 GMSL2 产品为例,它支持每个链路在正向方向以 3Gbps 或 6Gbps 的固定速率工作。

weixin_43199439的博客 3324

C++中的RTTI机制解析

C++中的RTTI机制解析 RTTI RTTI概念 RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够使用基类的指针或引用来检查着这些指针或引用所指的对象的实际派生类型。 RTTI机制的产生 为什么会出现RTT...

dichuangheng8094的博客 1138

ABB机器人姿态与四元数(笔记)

通常使用机器人作业时,机器人的法兰轴(5轴)往往是垂直与作业平面的,此时需要将机器人的姿态调整(示教)到垂直于工作平面的状态,然后记录当前的姿态,作为之后作业的参考标准姿态。不同机器人表示控件姿态的方式不一样,但也无外乎3中:旋转矩阵、欧拉角和四元数。 ABB机器人使用的是四元数(可转欧拉角)作为机器人控件姿态的表示方式。这里主要是记录在不通过示教的方式下,如何定义四元数,使机器人达到垂直于工作平面的姿态。 5轴竖直向下(常用):此时,各轴角度为 [0,0,0,0,9...

Zythonista的博客 1万+

TTL电路搭建半加器实验:操作指南完整版

通过TTL电路搭建半加器,详解逻辑设计与实验步骤,帮助掌握数字电路中的半加器工作原理与实际应用,适合电子技术初学者动手实践。

weixin_42524864的博客 355

RTTI机制与作用

一、RTTI(Run-Time Type identification),通过运行时类型信息,程序能够使用基类的指针或引用来检查这些指针或引用所指向的对象的实际派生类型。面向对象的编程语言,想C++,Java,delphi都提供了RTTI的支持。RTTI并不是什么新技术,很早就有了,他主要提供了运行时确定类对象类型的方法。最近有用到这个RTTI,对它进行了一番小研究,下面做个小小的总结吧!

行而不辍,未来可期 - King 5313

Contest 226 - C - Martial artist

from atcoder Problem Statement Time Limit: 2 sec / Memory Limit: 1024 MB Score :300300points Takahashi is a martial artist. There areNNmoves that a martial artist can learn, called Move11,22,\ldots…,NN. For each1 \leq i \leq N1≤i≤N, it takes...

m0_54674275的博客 1020

C/C++编程:RTTI机制

class node{...}; class type : public node{ ... }; class fct : public type{...}; class gen : public type{...}; typedef type *ptype; typedef fct *pfct; type-safe downcast downcast(向下转型):把基类转换为派生类 在C++2.0之前,可以使用explicit cast来将 simplify_conv_op(ptype pt){

OceanStar的博客 564

fluent二维叶型仿真_Fluent案例4【自然对流】

自然对流来了!!江苏的高校好多开学了,我啥时候才能开学另外,刚才看了何同学的Mac Pro深度体验视频,我好酸/(ㄒoㄒ)/~~好想拥有一台跑仿真那种sou~sou~sou~的机器。废话不多说了,进入正题!案例题目:一个矩形空腔内有500K恒温小球,矩形空腔充斥空气,边界条件绝热,模型尺寸如下,试模拟空腔内空气流动状态做出温度变化图。(尺寸大小懒得写了,在建模部分里有)操作平台:workbench...

weixin_39724469的博客 3670

小论文/大论文必备| YOLO26热力图可视化,支持8种常用热力图方法:GradCAM,GradCAMPlusPlus,XGradCAM,EigenCAM,HiResCAM等,助力小论文和大论文加分

本文介绍了如何为YOLO26模型添加热力图可视化功能,包括完整代码和使用教程。热力图能增强模型的可解释性,适用于论文中的实验对比和结果展示。文章提供了详细的代码实现,包含图像处理、热力图生成和结果可视化等功能,并指导用户如何创建Python文件、粘贴代码以及调整参数生成最佳热力图。通过设置不同层号,用户可以灵活控制热力图效果,最终结果将保存在指定文件夹中。

Ai缝合怪、助力小伙伴高效发论文 492

C++ RTTI详解

C++ RTTI详解1、RTTI简介2、typeid详解2.1、type_info2.2、typeid识别静态类型2.3、typeid识别动态类型2.4、typeid实现原理3、dynamic_cast详解4、总结 1、RTTI简介 RTTI(Runtime Type Identification)是“运行时类型识别”的意思。C++引入这个机制是为了让程序在运行时能根据基类的指针或引用来获得该指针或引用所指的对象的实际类型。但是现在RTTI的类型识别已经不限于此了,它还能通过typeid操作符识别出所有的基

游戏行业资深搬砖人员 2万+

ardupilot 获取避障传感器数据

本节主要记录自己学ardupilot的避障代码过程,首先看下怎么注册避障传感器,然后怎么获取避障数据。

陌城烟雨 5524

[cpp进阶]C++类型转换

当我们在函数中用父类的指针或引用接受参数时,接收的参数有可能指向父类对象也有可能指向子类对象,当接收的参数指向父类对象时,不需要做任何处理,当接收的参数指向子类对象时,有时就需要将该对象转换为原来的子类对象。

weixin_53027918的博客 1139

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【C++】特殊类的设计、单例模式以及Cpp类型转换

本文深入探讨C++中特殊类的设计方法与类型转换机制。针对特殊类设计,详细解析如何实现禁止拷贝、限制对象创建于堆/栈、防止继承及单例模式(饿汉与懒汉),并分析其应用场景与线程安全问题。在类型转换部分,系统介绍C++四种强制转换操作符(static_cast、reinterpret_cast、const_cast、dynamic_cast)的原理与适用场景,剖析隐式转换的潜在风险(如数据截断与死循环),并对比C风格转换的缺陷。通过实例代码与场景分析,帮助开发者掌握高效、安全的编程实践,提升代码健壮性与可维护性。

2303_77756141的博客 2234

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Cpp||类型转换

Cpp类型转换 文章目录Cpp类型转换1:c语言中的类型转换1.1:隐式类型转换:意义相似的类型1.2: 强制类型转换:意义差距较大的类型2:C++中的类型转换2.1:static_cast2.2:reinterpret_cast2.3:const_cast2.4:dynamic_cast 1:c语言中的类型转换 1.1:隐式类型转换:意义相似的类型 int main(){ int a=2; ...

Template Code 850

cpp 类型转换

cpp 丰富的类型允许根据不同的需求选择不同的类型,这也使计算机的操作更复杂。例如,将两个short值相加涉及到的硬件编译指令可能会与将两个long值相加不同。由于有11中整型和3种浮点类型,因此计算机需要处理大量不同的情况,尤其是对不同的类型进行运算时,为处理这种潜在的混乱,cpp自动执行很多类型转换: 将一种算术类型的值赋给另一种算术类型的变量时,cpp将对值进行转换; 表达式中包含不同的类型时,cpp将对值进行转换; 将参数传递给函数时,cpp将对值进行转换; 1.初始化和赋值...

liguandong 2380

C++的类型转换

C语言和C++都是强类型语言,如果赋值运算符左右两侧变量的类型不同,或形参与实参的类型不匹配,或返回值类型与接收返回值的变量类型不一致,那么就需要进行类型转换。C语言中有两种形式的类型转换,分别是隐式类型转换和显式类型转换:隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败。显式类型转换:需要用户自己处理,以`(指定类型)变量`的方式进行类型转换。需要注意的是,只有相近类型之间才能发生隐式类型转换,不相近类型之间只能进行强制类型转换。

2021dragon的博客 7571

【C++】—— C++的类型转换

C++的类型转换详解

m0_56069910的博客 3673

C++强制类型转换

C++ 类型转换(C风格的强制转换): 在C++基本的数据类型中,可以分为四类:整型,浮点型,字符型,布尔型。其中数值型包括 整型与浮点型;字符型即为char。 (1)将浮点型数据赋值给整型变量时,舍弃其小数部分。 (2)将整型数据赋值给浮点型变量时,数值不变,但是以指数形式存储。 (3)将double型数据赋值给float型变量时,注意数值范围溢出。 (4)字符型数据可以赋值给整型变量,此时存入的是字符的ASCII码。 (5)将一个int,short或long型数据赋值给一个char型变量,只

q610098308的专栏 6万+

【C++】类型转换

如果,或者,或者,就需要有以下两种形式:1.隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败2.显式类型转化:需要用户自己处理:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。

关注学习C++领域,感谢陪伴,共同进步! 1436

cpp 4个类型转换

static_cast、dynamic_cast、reinterpret_cast、const_cast 之间的区别 static_cast 用法:static_cast (expression) 说明:该运算符把expression转换为typeid类型,但没有运行时类型检查来确保转换的安全性。 用途: 用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指...

weixin_33984032的博客 1045

【C++】四种强制类型转换

C++ 四种强制类型转换   C语言中的强制类型转换(Type Cast)有显式和隐式两种,显式一般就是直接用小括号强制转换,TYPE b = (TYPE)a; 隐式就是直接 float b = 0.5; int a = b; 这样隐式截断(by the way 这样隐式的截断是向 0 取整的,我喜欢这么叫因为 0.9 会变成 0,1.9 变成 1,-0.9 变成 0,-1.9 变成 -1)。  ...

Bob__yuan的博客 4万+

C++ 类型转换

隐式类型转换 1 数值类型转换 2 指针类型转换 显式类型转换 1 explicit关键字 1 强制类型转换 11 static_cast 12 dynamic_cast 13 const_cast 14 reinterpret_cast 参考资料 C++类型转换大体上包括隐式类型转换和显式类型转换。1. 隐式类型转换隐式类型转换是自动执行的,无需显式的操作符。 隐式类型转换发生在很多地方,比如函数

shuzfan的专栏 1万+

【C++】C++的类型转换

本篇文章概要性地介绍了C语言与C++中的类型转换机制。首先,回顾了C语言中的类型转换方式。然后,阐述了C++为何需要四种强制类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast),以适应其面向对象的特性及复杂的类层次结构。接着,详细说明了这四种强制类型转换的使用场景与特点。此外,简要介绍了RTTI(运行时类型识别)的概念。希望本篇文章对大家学习C++类型转换有所帮助。

是阿建吖! 900

Cpp_类型转换

C风格的类型转换C++完全兼容。C++新增了四个显式类型转换运算符。 1)静态类型转换:static_cast<目标类型> A.将基类的指针或引用转换为子类的指针或引用; B.自定义类型转换。它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类,但会给出编译警告下面的例子中,被转换的父类没有被检查是否与目的类型相一致。class Ba

Jerry的专栏 1022

C++四种强制类型转换

文章目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C++的区别3 static_cast4 reinterpret_cast5 const_cast6 dynamic_cast6.1 向上转型(Upcasting)6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换

u_hcy2000的博客 1万+
上一篇: C++特殊类设计与单例模式
下一篇: C++的IO流
Brant_zero2022
博客等级 码龄5年 582粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值