c++类型转换运算符详解

C++的类型转换运算符总结 前言 1 dynamic_cast 2 static_cast 3 const_cast 4 reinterpret_cast 总结 参考链接 前言   C语言的类型转换比较自由,但也带来了一些问题,这些问题大多由程序员自行控制和解决。对于庞大的C++语言机制而言,这种简单粗暴的类型转换方式显然是个巨大的负担,因此C++引入4种类型转换运算符,更加严格的限制允许的类型转换,... 阅读详情

c++提供了4个类型转换运算符,使得转换过程更加的规范。

目录

1、static_cast

2、const_cast

3、dynamic_cast  

4、reinterpret_cast


 

1、static_cast

语法:static_cast <type-name>( expression )

static_cast用于类型转换,但运行时没有类型检查来保证转换的安全性。主要有以下几种用途

1)用于基本数据类型之间的转换

​double a = 10.06;
int b = static_cast<int>(a);

cout << "a=" << a << endl;    //输出10.06
cout << "b=" << b << endl;    //输出10

2) 用于父类指针或引用转换为子类指针或引用(向下转换),或者把子类指针或引用转换为父类指针或引用(向上转换)

需要注意的是,进行向上转换是安全的。进行向下转换是不安全的。因为没有动态类型检查。

3)用于把指向void的指针转换为指向任何类型的指针

int value = 99;
void *a = &value;
char *b = static_cast<char*>(a);	

cout << "b=" << *b << endl;	//输出c

2、const_cast

语法:const_cast< type-name > (expression)

const_cast的用途是,用于执行只有一种用途的类型转换,即改变值为const类型或者volatile类型。使用它可以返回一个指向非常量的指针(或引用)。

栗子:

class Test
{
public:
	Test() :m_cnt(0)
	{}
	int m_cnt;
};

int main()
{
	const Test t;
	//t.m_cnt = 10;	//错误,不可修改
	cout << t.m_cnt << endl;	//输出0
	Test *n = const_cast<Test*>(&t);
	n->m_cnt = 10;
	cout << t.m_cnt << endl;	//输出10
    
    getchar();
    return 0;
}

再看下面一个栗子:

const int value = 10;
//int *p_value = &value;		//错误,const int*类型,不能用于初始化int*类型的实体
volatile const int *p_value = &value;  //正确

//*p_value = 30;	//错误,不能通过指针a来修改value的值
//但是我们就是想通过指针修改value的值呢,这时候const_cast登场了,
int* b = const_cast<int*>(p_value);
*b = 20;

cout << "*b=" << *b << endl;	    //输出20
cout << "value=" << value << endl;	//输出10
​

这里需要注意一个问题,通过const_cast转换后,已经可以通过指针b修改value的值了,对b取值的确是20,但是value却输出了10,难道是因为没有对value的值修改成功么?其实原因是c++编译器的机制,编译器对const变量进行了优化,把value放在了符号表中,为了取值操作更高效。当我们用指针b去改变value的值后,value所对应的内存地址存储的值已经变成20。但是符号表中的值却并没有改变。所有value还是输出10。而真实的value其实是20。

如果把const int value=10修改为volatile const int value = 10; 这时候再输出,发现value输出的是20。因为volatile修饰的变量,每次都是从寄存器中去读取的。

3、dynamic_cast  

语法:dynamic_cast< type-name > (expression)

dynamic_cast可用于向上转换,即将子类指针转换为父类指针,主要用于确保可以安全的调用虚函数,当然也可用于向下转换。

同dynamic_cast转换能够进行的前提条件就是父类中有虚函数,这个前提条件的原因主要是因为只有让父类指针或引用指向子类对象的情况下,转换才有意义。static_cast没有这个要求。

但是在类间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

栗子

class A
{
public:
	A() :m_cnt(0)
	{}
	int m_cnt;

	virtual void func(){}
};

class B :public A
{
public:
	char *p;
};

int main()
{
	//向上转换
	B b;
	A* a = dynamic_cast<A*>(&b);
	if (a == NULL){
		cout << "a = NULL" << endl;
	}else{
		cout << "a != NULL" << endl;
	}

	//向下转换
	A t;
	B* b1 = static_cast<B*>(&t);
	if (b1 == NULL){
		cout << "b1 = NULL" << endl;
	}
	else{
		cout << "b1 != NULL" << endl;
	}

	B* b2 = dynamic_cast<B*>(&t);
	if (b2 == NULL){
		cout << "b2 = NULL" << endl;
	}else{
		cout << "b2 != NULL" << endl;
	}

    return 0;
}

输出

可以看到,向下转换时,static_cast返回了B类型的指针,对它进行 B 类型的操作将是不安全。但是dynamic_cast返回为空。

4、reinterpret_cast

语法:reinterpret_cast <type-name>( expression )

它是C++中的强制类型转换符。这个转换我目前很少用到,先待定。

C++类型转换详解:从隐式转换到四种强制转换运算符 类型转换是编程语言中处理不同数据类型间相互操作的基础机制,其核心原理在于编译器或运行时系统根据预设规则调整数据的表示形式或解释方式。在C++这类系统级语言中,类型转换直接关系到内存布局、数据精度和程序行为,是保障代码健壮性和性能的关键技术。正确的类型转换能确保数据完整性、支持多态特性,并实现底层资源访问。其应用场景广泛,从数值计算、类层次结构操作到与硬件或C接口交互均离不开它。本文聚焦于C++类型转换这一核心主题,深入剖析隐式转换的潜在风险,并系统讲解static_cast、dynamic_cast、con 阅读详情

相关推荐

C++分数类实现:运算符重载与类型转换实战指南

在C++编程中,运算符重载是实现自定义类型与内置类型行为一致性的核心技术,它允许开发者为类定义如+、-、*、/等操作符的具体行为。其原理是通过定义特定的成员函数或全局函数,使编译器在遇到相应操作符时调用这些自定义逻辑。这项技术的核心价值在于提升代码的直观性和可读性,让用户自定义类型能够无缝融入C++的表达式体系,实现更自然的语法。在需要高精度计算或特定数学抽象的场景,如金融量化、物理引擎或游戏开发中,一个设计良好的自定义数值类型至关重要。本文聚焦于构建一个健壮的分数类,深入探讨了如何通过运算符重载实现分数的

weixin_27134495的博客 335

笔记:类型转换运算符

类型转换运算符(conversion operator)是类的一种特殊成员函数,它负责将一个类类型的值转换成其他类型。类型转换函数的一般形式是: operator type() const; 其中,type表示转换目标类型,除了void、数组或函数类型,但允许转换成指针(包括数组指针及函数指针)。类型转换运算符既没有显式的返回类型,也没有形参,而且必须定义为类的成员函数。类型转换运算符通常...

酒红的专栏 2446

【C++】day02 - 【内联函数】【参数哑元】【参数的默认值】【c++ 动态内存分配new()】【c++中的引用】【c++中的四种类型转换运算符】【c++之父给c程序员的建议】

目录一、内联函数1.1内联函数概述1.2如何实现1.3内联函数适用场景二、参数哑元2.1概念2.1作用三、参数的默认值3.1概念3.2语法3.3程序举例四、c++ 动态内存分配new()五、c++中的引用5.1概念5.2语法5.3程序举例5.4引用的简单实现(原理)5.5引用的应用六、c++中的四种类型转换运算符6.1 static_cast<类型>(变量)6.2 dynamic_cast<类型>(变量)6.3 const_cast<类型>(变量)6.4 reinterp

weixin_45519751的博客 244

c++类型转换运算符

C++中有4个类型转换运算符,使装换过程更规范 dynamic_cast; const_cast; static_cast; reinterpret_cast;一、dynamic_cast 该运算符我在之前的文章中已经介绍过了 http://blog.youkuaiyun.com/a992036795/article/details/51459139 总之,该运算符的语法如下: dynamic_cast

BlueBerry的专栏 665

LinuxMint 22.1(Ubuntu24.04)下通过Wine完美运行同花顺远航版的实战指南

本文详细介绍了在LinuxMint 22.1(Ubuntu24.04)系统下通过Wine完美运行同花顺远航版的实战指南。从基础环境准备到深度优化,包括Wine环境配置、同花顺远航版安装、字体显示调优、任务栏兼容性修复等关键步骤,帮助Linux用户高效使用同花顺远航版进行股票交易和行情分析。

weixin_30919429的博客 570

从封装到先进封装:一文讲透Chiplet、2.5D/3D堆叠与系统集成

封装是芯片产业链中连接硅片与电路板的桥梁,承担物理保护、电气连接、散热与机械支撑等核心任务。传统封装从DIP、QFP发展到BGA,通过提升引脚密度满足早期性能需求。随着摩尔定律放缓,单纯缩小晶体管尺寸难以为继,先进封装应运而生,其核心理念从“封装单颗芯片”转向“系统级高密度集成”。扇出型封装、2.5D硅中介层、3D堆叠、Chiplet和系统级封装等技术,通过微米级互连和垂直堆叠,大幅提升I/O密度与带宽,成为AI芯片、HBM存储、高性能计算等领域的关键支撑。本文梳理先进封装的技术演进、分层架构与工程难点,帮

weixin_29185167的博客 365

C++类型转换运算符

类型转换是一种机制,让程序员能够暂时或永久性改变编译器对对象的解释。但这并不意味着程序员改变了对象本身,而只是改变了对对象的解释。可改变对象解释方式的运算符称为类型转换运算符。如果 C++应用程序都编写得很完善,其处于类型是安全的且是强类型的世界,则没有必要进行类型转换,也不需要类型转换运算符。然而,在现实世界中,不同模块往往由不同的人编写,而使用不同开发环境的厂商需要协作。因此,程序员经常需要让编译器按其所需的方式解释数据,让应用程序能够成功编译并正确执行。

pxxzhk的博客 771

《机器人学一(Robotics(1))》_台大林沛群 第 3 周 【机械手臂 顺运动学】Quiz 3

的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。的方向,旋转方向与四指弯曲方向相反,为负, α为 -90。bug 的图 要求解的 i 位置有误 两套 题目?B. 第2个 坐标系 的原点位置 不便于 计算;上面的正确,后两题 有误, 不知道问题在哪里。标准部分, 前面的更常用,这种仅作为 了解。还是计算过程中保留两位有效数字 不符合。2、确定 旋转角 α 正负的右手定则。1、确定坐标系方向的右手定则。可相交,距离为 0。A: 右手拇指指向。小数点后两位,不符合。

weixin_46034116的博客 1242

C++ 四种类型转换操作符

在c++中进行类型转换只需要在变量前加上变量类型,并且转换是双向的。 例如: int i = 0; double d = 1.9; int i1= (int) d; double d1= (double) i; 这种类型转换方式只适用于基本数据类型,对复杂的自定义类型不适用。 因此,C++中提供了四种类型转换符:static_cast、dynamic_cast、const_cast...

qq_39025293的博客 1378

存储硬盘格式怎么把512还原为520格式??

硬盘厂商工具(如SeaChestsg_format)可以调整扇区大小。备份数据,因为调整扇区会清除硬盘内容。根据硬盘型号和接口类型,选择合适的工具进行调整。如果你需要更详细的帮助,请提供你的硬盘型号和存储设备类型。希望如上措施及解决方案能够帮到有需要的你。PS:如若遇到采纳如下方案还是未解决的同学,希望不要抱怨&&急躁,毕竟影响因素众多,我写出来也是希望能够尽最大努力帮助到同类似问题的小伙伴,即把你未解决或者产生新Bug黏贴在评论区,我们大家一起来努力,一起帮你看看,可以不咯。

**My Coding Family** 1142

一文搞定离线环境下的RAG引擎部署

在人工智能浪潮下,技术已成为构建智能问答、文档分析和代码助手等应用的核心。然而,在许多企业场景中,出于数据安全和性能的考虑,服务器往往部署在中,并要求极致的推理效率。这给依赖外部资源的应用部署带来了巨大挑战。如何在这种严苛的环境下,完整、可靠地部署一套包含向量数据库、**高性能推理服务(vLLM)**和Python后台的复杂RAG系统呢?本文将为你提供一个,手把手教你如何使用 Docker 技术,将一套基于 Weaviate 和的 Python RAG 应用完整打包,并在离线环境中一键部署。

木鱼时刻的专栏 1241

C++中四种类型转换运算符详解

使用C++有些时间了,但对于C++中的类型转换运算符了解的并不深,之前用static_cast做一些简单的C++内置类型之间的转化,其实可以用(typename)来替换的,用dynamic_cast做一些类对象之间的转换,对于reinterpret_cast和const_cast,用到不是很多,偶尔看到一本书中有对这四种类型转换运算符的论述,讲解的比较详细。 具体归纳如下: reinter

一柯的专栏 1273

ZYNQ工业级串口方案:AXI UART 16550扩展RS-485实战(自动方向控制+Linux驱动)

可以轻松扩展出多路工业级串口。但常规方案需要手动控制收发方向(DE/RE引脚),存在实时性差、CPU占用高等痛点。本文从硬件逻辑设计到Linux驱动开发,完整实现了ZYNQ平台的RS-485工业通信方案。,解决了传统方案实时性差的痛点。所有代码均经过实际项目验证,可直接用于生产环境。:尝试将此设计扩展为多协议兼容接口(支持RS-422/RS-232切换)!等特性,依然是现场总线通信的首选。,通过硬件逻辑+Linux驱动协同设计,实现零延迟切换。在工业自动化、能源电力等场景中,RS-485凭借。

QQ_778132974的博客 830

C++类型转换运算符详解

好处是,比较方便,因为,使用老式类型转换,你无需具体区分到底使用的是哪一种,只要按照顺序依次试一试能不能转换就行了。第二,老式类型转换是比较难识别的,不管是c风格的也好,函数式的也好,都是只用一个括号就可以了。2,一般来说,建议以上两种类型转换方式不要使用,改为使用以下四种类型转换方式,如果你拒绝这个提议的话,那么建议使用函数式的类型转换方式。如果通过static_cast去转换具有继承关系的类,那么向上或者向下转换都是可以被允许的,但是转换为无关的类型是不被允许的。const_cast<类型>(表达式)

m0_74824496的博客 188

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

VSCode PlantUML 插件超详细教程:从安装配置到实战绘图全流程

weixin_69237381的博客 908

21、二维卷积层(convolution2dLayer)的全面解析

本文全面解析了二维卷积层(convolution2dLayer)的原理、属性和应用,详细介绍了其在深度学习中的作用及实现方法。文章涵盖创建卷积层的语法、参数设置、算法原理、输入输出格式、优化策略以及实际应用案例,旨在帮助读者更好地理解和应用二维卷积层构建高效的深度学习模型。

red88的博客 313

【C++ | 类型转换】转换构造函数、类型转换运算符 详解及例子源码

👉本文介绍了自定义类型的类型转换,先是介绍 转换构造函数 将其他类型转换为本类类型,然后介绍 类型转换运算符 将本类类型转换为其他类型。

wkd_007的博客 2545

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++ 四种类型转换运算符详解

C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。   const_cast,字面上理解就是去const属性。   static_cast,命名上理解是静态类型转换。如int转换成char。   dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。   reinterpreter_cast,仅仅重新解释类型,但没有进行二进制的转换。

人生代码,代码人生。。。 1013

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++四种类型转换运算符详解

一、C风格类型转换 char* staticStr = "Hello World"; int* intArray = (int*)staticStr;         这种类型转换是不安全的,C++编程应该尽量使用C++的类型转换运算符   二、C++类型转换运算符 1. static_cast     static_cast 用于在相关类型的指针之间进行转换,还可以显示的执行标准数...

阿飞的博客 2269

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

详解c++的类型转换,static_cast、dynamic_cast、const_cast、reinterpret_cast运算符

c中变量的数据类型可以强制转换为其他数据类型。但由于这种C风格的类型转换可能会出现一些问题,即过于松散的情况和因此 C++ 提出了更加规范、严格的类型转换,添加了四个类型转换运算符,进而更好的控制类型转换过程。

z3363的博客 1150

C++类与对象详解(3)运算符重载、const 与类型转换

本文深入探讨了C++中类和对象的高级特性,以日期类为例,重点讲解了运算符重载、const成员函数和类型转换三大主题。在运算符重载部分,分析了流运算符作为全局函数实现的必要性,并介绍了友元函数的使用场景。const成员函数章节揭示了const对象的限制,强调只读函数应声明为const。类型转换部分通过单参数构造函数的隐式转换问题,引出explicit关键字的重要作用。文章最后给出了最佳实践建议:流运算符采用全局函数+友元形式,只读函数添加const修饰,单参数构造函数使用explicit,参数传递优先考虑co

日拱一卒,功不唐捐 349

C++中的类型转换运算符dynamic_cast、static_cast、const_cast和reinterpret_cast详解

C++中的类型转换运算符零、小序一、dynamic_cast1、关于dynamic_cast2、代码示例二、static_cast1、关于static_cast2、代码示例三、const_cast1、关于const_cast2、代码示例四、reinterpret_cast1、关于reinterpret_cast2、代码示例五、总述 零、小序 C++程序员都知道,C语言中的强制转换和万能转换指针“v...

ISmileLi的博客 725

C++笔记 14.9 重载类类型转换运算符

primer C++笔记 重载、类型转换与运算符 类型转换运算符可能产生意外结果 显示的类型转换运算符 转换为bool 避免二义性的类型转换 实现匹配和相同的类型转换 二义性与转换目标为内置类型的多重类型转换 重载函数与转换构造函数 重载函数与用户定义的类型转换 函数匹配与重载运算符 ...

qq_36333986的博客 159

C++算术运算符与类型转换

这种方式的好处和坏处都很明显,好处是它不允许变量长度缩窄的情况,坏处则是又增加了学习的成本。相加的时候,由于涉及到两种类型,其中范围较小的那个会被转换成较大的类型。前面说了,同样是除法,根据除数和被除数类型的不同,得到的结果也不同。因为通常int类型都是计算机最自然的类型,也意味着计算机在处理int的时候,处理的速度最快。当我们的除数和被除数都是整数的时候,得到的结果也会是一个整数。也就是说不会影响b的类型。的时候,同样也会有类似的问题,所以在进行赋值的时候,当两个变量的类型不同时,千万要当心。

qq360737395的博客 337

C++运算符重载与类型转换实战:打造原生体验的自定义日期类

运算符重载和类型转换是C++中实现自定义类型行为像内置类型的关键技术。通过重载关系运算符(如<、>、==)和算术运算符(如-),可以让对象支持直观的比较和运算;而转换运算符则定义了对象到其他类型(如整型、布尔型)的显式或隐式转换规则,增强了类型在逻辑和计算上下文中的适应性。这些技术能显著提升代码的抽象层次、可读性和可维护性,是构建高质量、易用类库的基础。在工程实践中,结合日期处理等常见场景,合理运用运算符重载与类型转换,可以避免繁琐的if-else判断,实现如`date1 - date2`计算天数差、`if

weixin_27013291的博客 301

day8.运算符重载 类型转换 深浅拷贝

【代码】day8.运算符重载 类型转换 深浅拷贝。

LI1109hd的博客 18
上一篇: VS2013中使用sprintf函数报错的问题解决方法
下一篇: c++为什么基类的析构函数需要加上virtual
Qt上位机开发
Qt上位机开发 领域专家: C/C++技术领域 领域专家: C/C++技术领域
博客等级 码龄9年 9664粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值