C++四种类型转换方式

article/2025/7/22 8:52:24
  • const_cast,去掉(指针或引用)常量属性的一个类型转换,但需要保持转换前后类型一致
  • static_cast,提供编译器认为安全的类型转换(最常使用)
  • reinterpret_cast,类似于c语言风格的强制类型转换,不保证安全;
  • dynamic_cast,主要用于继承结构中,可以支持RTTI类型识别的(基类到派生类)转换

const_cast

	const int a = 10;//const_cast去掉常量属性,从const int *转换成int *int* p = const_cast<int *>(&a);//const_cast去掉常量属性,从const int &转换成int &int ref = const_cast<int&>(a);//报错,无法从const int 转换成int,//const_cast<这里必须是指针类型或引用类型>int b = const_cast<int> (a);//const_cast转换前后需要保持类型一致,这里错误,无法从const int *转换成char *char* p = const_cast<char*>(&a);

static_cast

	//static_cast,可以转换编译器认为有联系之间的类型,如(int和char),(基类和派生类)//int 和 char 都是整数类型,可以安全转换(但可能会发生截断,如果 b 超过 char 的范围int b = 10;char c = static_cast<char> (b);//没有任何联系的两个类型转换,编译器认为是不安全的,不能转换成功// int* 和 short* 是完全不同的指针类型,它们指向的数据大小不同(int 通常是 4 字节,short 通常是 2 字节)int *p = nullptr;short* p1 = static_cast<short> (p);

这里可以转换编译器认为有联系的类型,拒绝不安全的类型转换。

reinterpret_cast转换

	int* p = nullptr;//提供c语言风格的强制类型转换,不保证安全,等效于double *p1=(double *) p;//实际上不安全,double解引用为8个字节,int解引用为4个字节,会造成访问越界double* p1 = reinterpret_cast<double *> (p);

dynamic_cast转换

class Animal {
public:virtual void bark() = 0; // 必须要有虚函数(多态类型)
};class Dog : public Animal {
public:void bark() { cout << "Dog Woof! Woof!" << endl; }
};class Cat : public Animal {
public:void bark() { cout << "Cat Meow! Meow!" << endl; }
};void showAnimal(Animal* animal) {animal->bark();	
}int main() {Dog dog;Cat cat;showAnimal(&dog); showAnimal(&cat); return 0;
}

这里通过的showAnimal函数通过基类指针指向不同的派生类,从而实现调用其对应的重写方法。
但是比如说,对于Dog类,我想调用实现其另一个eat方法。

class Dog : public Animal {
public:void bark() { cout << "Dog Woof! Woof!" << endl; }//新增eat方法void eat() { cout << "Dog like eat bone!"<<endl; }
};

当调用showAnimal方法时,如果其指向的时Dog方法,就调用eat方法,就可以通过dynamic_cast实现,如代码所示

void showAnimal(Animal* animal) {Dog* dog = static_cast<Dog*>(animal); // 尝试转换为 Dog*if (dog) {dog->eat();}else{animal->bark();}}

dynamic_cast<Dog*>(animal) 会检查 animal 是否真的指向 Dog 对象:

  • 如果是,返回 Dog*;
  • 如果不是,返回 nullptr(而不是崩溃或未定义行为)

在这里插入图片描述

我们之前也说了static_cast也可以进行基类和派生类的转换,但是这里是不会判断直接进行转换的,不管基类指针是不是指向Dog的派生类,都一律被转换成Dog的派生类;而dynamic_cast会进行判断,只有基类指针指向的是Dog类型的派生类时,才发生转换,否则返回nullptr。

在这里插入图片描述

最后,目前就先总结这些,后续项目中遇到了再添加内容。


http://www.hkcw.cn/article/cxhPygIYic.shtml

相关文章

得物C++开发面试题及参考答案

HTTP/HTTPS 协议的区别及 HTTPS 加密过程 HTTP&#xff08;超文本传输协议&#xff09;是一种用于传输超文本的协议&#xff0c;它是明文传输的&#xff0c;这意味着数据在传输过程中容易被截取和篡改&#xff0c;存在较大的安全隐患。而 HTTPS&#xff08;超文本传输安全协议…

头歌之动手学人工智能-Pytorch 之优化

目录 第1关&#xff1a;如何使用optimizer 任务描述 编程要求 测试说明 真正的科学家应当是个幻想家&#xff1b;谁不是幻想家&#xff0c;谁就只能把自己称为实践家。 —— 巴尔扎克开始你的任务吧&#xff0c;祝你成功&#xff01; 第2关&#xff1a;optim.SGD 任务描述…

RV1126-OPENCV Mat理解和AT函数

一.Mat概念 Mat 是整个图像存储的核心也是所有图像处理的最基础的类&#xff0c;Mat 主要存储图像的矩阵类型&#xff0c;包括向量、矩阵、灰度或者彩色图像等等。Mat由两部分组成&#xff1a;矩阵头&#xff0c;矩阵数据。矩阵头是存储图像的长度、宽度、色彩信息等头部信息&a…

DeepSeek R1-0528模型:五大升级亮点,引领AI推理新高度

在AI技术迅猛发展的浪潮中&#xff0c;模型的迭代升级不断推动着行业的进步。DeepSeek R1-0528模型的推出&#xff0c;犹如一颗重磅炸弹&#xff0c;在AI领域激起千层浪。它究竟有何神奇之处&#xff1f;下面为你揭秘其五大全新升级亮点。 深度思考能力显著提升 DeepSeek R1-05…

司机缺氧离世有5个上学孩子 家庭重担引关注

近日,46岁的河南卡车司机常志荣在青藏高原离世,卡友团队一同将其骨灰接回老家。6月1日,常志荣已经在老家安葬。他去世后,留下了重组家庭的6个孩子,其中5个孩子还在上学。车友任先生透露,常大哥出发青藏线运输前,同行曾建议他至少携带两罐氧气,但他为省下30元费用,最终…

迪士尼情侣和一家三口打架 拍照争执引发冲突

6月1日,浦东公安分局接到报警称迪士尼乐园内发生打架事件。初步调查显示,闫某某(男,22岁)与女友在拍照时,因刘某某(男,36岁)夫妻的女儿进入拍摄画面,双方发生口角并引发肢体冲突,造成闫某某和刘某某互有皮外伤,小女孩未受伤。目前,调查处理工作正在进行中。当天,…

温度计“液泡”是什么,温度计为什么能测温?

温度计“液泡”是什么&#xff0c;温度计为什么能测温&#xff1f; 液体膨胀式温度计介绍 最近&#xff0c;有位小朋友说&#xff0c;他看的一本科普书上说&#xff1a;把温度计插在水里&#xff0c;水分子就会对液泡产生撞击&#xff0c;液泡里面的分子就会跟着动起来&#x…

C++学习过程分享

空指针&#xff1a;int *p NULL; 空指针&#xff1a;指针变量指向内存中编号为0的空间&#xff1b;用途&#xff1a;初始化指针变量注意&#xff1a;空指针指向的内存不允许访问注意&#xff1a;内存编号为0-255为系统占用空间&#xff0c;不允许用户访问 野指针&#xff1a;…

【IC】RTL功耗高精度预测

介绍 美国能源部&#xff08;DOE&#xff09;的一份综合报告“半导体供应链深度潜水评估”&#xff08;2022年2月&#xff09;呼吁将能源效率提高1000倍&#xff0c;以维持未来的需求&#xff0c;因为世界能源产量有限。能源效率是当今设计师的首要任务。能源效率的整体方法必…

美国要求澳大利亚上调军费 提升至GDP的3.5%

当地时间6月1日,美国国防部长赫格塞思在新加坡会见了澳大利亚副总理兼国防部长理查德马尔斯。双方讨论了美澳联盟的关键优先事项。赫格塞思在会谈中建议澳大利亚尽快将国防开支提高到国内生产总值的3.5%。尽管澳大利亚不是北约成员国,美国总统特朗普此前曾多次要求北约成员国…

高反缺氧去世卡友已回老家下葬 留下6个孩子引关注

近日,46岁的河南卡车司机常志荣在青藏高原不幸离世。他的卡友团队一同将其骨灰接回老家,并于6月1日在老家安葬。常志荣去世后,留下了重组家庭的六个孩子,其中五个孩子还在上学。车友任先生透露,常志荣出发前曾被建议至少携带两罐氧气,但他为了节省30元费用,最终只购买了…

亚历山大本赛季两战步行者场均39分 雷霆双胜步行者

NBA总决赛的对阵双方是雷霆和步行者。本赛季两队交手两次,雷霆分别以120-114和132-111取胜。这两场比赛中霍姆格伦都没有出战。亚历山大在这两场比赛中的表现非常出色,场均能够贡献39分、7篮板、8助攻、1抢断和1盖帽,场均罚球次数达到11.5次,真实命中率为71.1%。在面对步行…

六地将有大到暴雨 端午出行需谨慎

中央气象台今日6时继续发布暴雨蓝色预警和强对流天气蓝色预警。福建、广东、广西等六个地区将出现大到暴雨,多地还将遭遇8级以上的雷暴大风或冰雹天气。正值端午假期最后一天,出行前请务必关注天气情况。责任编辑:zhangxiaohua

017搜索之深度优先DFS——算法备赛

深度优先搜索 如果说广度优先搜索是逐层扩散&#xff0c;那深度优先搜索就是一条道走到黑。 深度优先遍历是用递归实现的&#xff0c;预定一条顺序规则&#xff08;如上下左右顺序&#xff09; &#xff0c;一直往第一个方向搜索直到走到尽头或不满足要求后返回上一个叉路口按…

举办中国户外运动展哪个城市较理想

杭州&#xff1a;强劲经济引擎&#xff0c;中国户外运动展的理想之选&#xff01; 为什么是杭州&#xff1f;—— 硬核实力&#xff0c;无可争议&#xff01; 经济活力领跑&#xff1a; 浙江人均GDP超2.5万美元&#xff0c;人均收入与消费全国TOP 1&#xff01;2024年省外人口…

JMeter接口自动化脚本框架

登录后的CRUD自动化脚本 内容&#xff1a; 用户自定义变量 ${}引用 HTTP请求默认值&#xff1a;复用内容 HTTP信息头&#xff1a;请求类型、token、cookie setUp、tearDown线程组&#xff1a;前后置操作 响应断言&#xff1a;文本、代码 Json提取器&#xff1a;提取响应…

缺氧离世卡车司机已下葬卡友发声 家庭重担引关注

近日,46岁的河南卡车司机常志荣在青藏高原离世,卡友团队将其骨灰接回老家。6月1日,他在老家安葬。常志荣去世后,留下了重组家庭的6个孩子,其中5个还在上学。据车友任先生透露,常志荣出发前同行曾建议他至少携带两罐氧气,但他为省下30元费用,最终只购买了一罐氧气。常志…

【C++】多态

目录 1. 多态的概念 2. 多态的定义和实现 2.1 构成多态的条件 2.2 虚函数 2.3 虚函数的重写&#xff08;覆盖&#xff09; 2.4 小试牛刀 3. 重载/重写/隐藏的对比 4. 纯虚函数和抽象类 5.多态的原理 5.1 虚表 5.2 虚表指针 5.3 对比虚函数、虚表、虚表指针 1. 多态的…

肖战演活了藏海 台湾观众好评如潮

正在热播的电视剧《藏海传》在台湾引起了广泛关注,不仅获得了岛内观众的一致好评,也得到了媒体的争相报道。这部剧以其精良的制作、紧凑的情节以及所展现的中华文化深深吸引了台湾观众。5月31日,“肖战演藏海在台湾刷屏”这一话题冲上了微博热搜榜。近年来,大陆电视剧在台湾…

C# 多线程编程全面指南:从基础到高级实践

在现代软件开发中&#xff0c;多线程编程已成为提升应用程序性能的关键技术。C# 作为.NET平台的主力语言&#xff0c;提供了丰富的多线程处理机制。本文将全面介绍C#中的多线程编程技术&#xff0c;从基础概念到高级应用&#xff0c;帮助开发者掌握这一重要技能。 一、多线程基…