[C++][C++类型转换]详解

目录

  • 1.C语言中的类型转换
  • 2.为什么C++需要四种类型转换?
  • 3.C++强制类型转换
    • 1.static_cast
    • 2.reinterpret_case
    • 3.const_cast
    • 4.dynamic_cast
  • 4.RTTI(了解)

1.C语言中的类型转换

  • 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时就需要发生类型转化
  • C语言中总共有两种形式的类型转换:
    • 隐式类型转换(意义相近的类型):编译器在编译阶段自动进行,能转就转,不能转就编译失败
    • 显式类型转换(意义不相近的类型,值转换后有意义):需要用户自己处理
  • 缺陷:
    • 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换

2.为什么C++需要四种类型转换?

  • C风格的转换格式很简单,但是有不少缺点:
    • 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
    • 显式类型转换将所有情况混合在一起,代码不够清晰
  • 因此C++提出了自己的类型转化风格
    • 注意:因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格
    • C++期望不要用C的类型转换了,期望用规范的C++显式强制类型转换

3.C++强制类型转换

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

1.static_cast

  • static_cast****用于非多态类型的转换(静态转换)
  • 编译器隐式执行的任何类型转换(意义相近的类型)都可用static_cast,但它不能用于两个不相关的类型进行转换
double d = 12.34;
int a = static_cast<int>(d);

2.reinterpret_case

  • reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释
  • 用于将一种类型转换为另一种不同的类型
int main()
{int a = 6;// 这里使用static_cast会报错,应该使用reinterpret_cast// int* p = static_cast<int*>(a);int* p = reinterpret_cast<int*>(a);return 0;
}

3.const_cast

  • const_cast最常用的用途就是删除变量的const属性,方便赋值
  • 一个值得思考的代码:
int main()
{const int a = 2;//volatile const int a = 2;int* p = const_cast<int*>(&a);//int* p = (int*)&a;*p = 3;cout << a << endl;  // 2  3cout << *p << endl; // 3  3return 0;
}

4.dynamic_cast

  • dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
    • 父类对象无论如何都是不允许转换成子类对象的
  • 向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
  • 向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
    • 为何需要向下转型这个操作呢?
      • A*指针pa有可能指向父类,有可能指向子类
      • 如果pa指向子类,那么可以转换,转换表达式返回正确的地址
      • 如果pa指向父类,那么不能转换,转换表达式返回nullptr
  • 注意:
    • dynamic_cast只能用于父类含有虚函数的类
    • dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr
class A
{
public:virtual void f() {}
};class B : public A
{};void fun(A* pa)
{// dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回B* pb1 = static_cast<B*>(pa);B* pb2 = dynamic_cast<B*>(pa);cout << "pb1:" << pb1 << endl;cout << "pb2:" << pb2 << endl;
}int main()
{A a;B b;fun(&a);fun(&b);return 0;
}
  • 注意:
    • 强制类型转换关闭或挂起了正常的类型检查
    • 每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的
    • 如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会
    • 强烈建议:避免使用强制类型转换

4.RTTI(了解)

  • RTTI:Run-time Type identification的简称,即:运行时类型识别
  • C++通过以下方式来支持RTTI:
    • typeid运算符 – 获取对象类型字符串
    • dynamic_cast运算符 – 父类的指针指向父类对象,还是子类对象
    • decltype – 推导一个对象类型,这个类型可以用来定义另一个对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/800224.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【小白学机器学习12】假设检验之3:t 检验 (t检验量,t分布,查t值表等)

目录 1 t 检验的定义 1.1 来自维基百科和百度百科 1.2 别名 1.3 和其他检验的区别 2 适用情况&#xff1a; 2.1 关于样本情况 2.2 适合检查的情况 2.2.1 单样本均值检验&#xff08;One-sample t-test&#xff09; 2.2.2 两独立样本均值检验&#xff08;Independent …

2024.4.6力扣每日一题——树节点的第 K 个祖先

2024.4.6 题目来源我的题解方法一 哈希表 超内存方法二 树上倍增 题目来源 力扣每日一题&#xff1b;题序&#xff1a;1483 我的题解 方法一 哈希表 超内存 使用一个哈希表存储每个节点的祖先节点。 时间复杂度&#xff1a;O(n) 空间复杂度&#xff1a;O( n 2 n^2 n2) class…

hydra九头蛇

一、hydra简介 Hydra是一款非常强大的暴力破解工具&#xff0c;它是由著名的黑客组织THC开发的一款开源暴力破解工具。Hydra是一个验证性质的工具&#xff0c;主要目的是&#xff1a;展示安全研究人员从远程获取一个系统认证权限。 目前该工具支持以下协议的爆破&#xff1a; A…

2024年华为OD机试真题-启动多任务排序-Java-OD统一考试(C卷)

题目描述: 一个应用启动时,会有多个初始化任务需要执行,并且任务之间有依赖关系,例如A任务依赖B任务,那么必须在B任务执行完成之后,才能开始执行A任务。 现在给出多条任务依赖关系的规则,请输入任务的顺序执行序列,规则采用贪婪策略,即一个任务如果没有依赖的任务,则…

蓝桥杯小白入门赛第9场第4题 字典树考试

问题描述 蓝桥学院最近教学了字典树这一数据结构,小蓝是全班的第一名,他不仅掌握了普通字典树,还自学了 01 字典树的使用。为了展示自己的能力,他向全班同学出了以下问题: 给定一个长度为 N N N 的数组 A A A , 你能否求出表达式 ∑ i = 1 N ∑ j = i + 1 N f ( A i …

【网站项目】农业信息管理系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

基于STM32f103芯片的应用程序在线升级功能框架的实现

目录 基于STM32f103芯片的应用程序在线升级功能框架的实现 一、原理简介 二、KEIL软件主要设置 三、应用程序app部分 四、Bootloader部分 五、补充部分 基于STM32f103芯片的应用程序在线升级功能框架的实现 一、原理简介 我们在使用stm32的过程中&#xff0c;如果需要对…

[C#]OpenCvSharp改变图像的对比度和亮度

目的 访问像素值mat.At<T>(y,x) 用0初始化矩阵Mat.Zeros 饱和操作SaturateCast.ToByte 亮度和对比度调整 g(x)αf(x)β 用α(>0)和β一般称作增益(gain)和偏置(bias)&#xff0c;分别控制对比度和亮度 把f(x)看成源图像像素&#xff0c;把g(x)看成输出图像像素…

Spring Boot集成Spring Retry快速入门Demo

1.Retry介绍 Spring Retry 提供了自动重新调用失败的操作的功能。这在错误可能是暂时的&#xff08;例如瞬时网络故障&#xff09;的情况下很有用。从2.2.0版本开始&#xff0c;重试功能已从Spring Batch中撤出&#xff0c;成为一个独立的新库&#xff1a;Spring Retry 使用场景…

蓝桥杯第十五届抱佛脚(十)贪心算法

蓝桥杯第十五届抱佛脚&#xff08;十&#xff09;贪心算法 贪心算法基本概念 贪心算法是一种在算法设计中常用的方法&#xff0c;它在每一步选择中都采取在当前状态下最好或最优&#xff08;即最有利&#xff09;的选择&#xff0c;从而希望导致结果是最好或最优的算法。 贪…

身份证实名认证接口的价格一般是多少呢?基于PHP身份核验接口

身份证实名认证接口分为身份证二要素、三要素、三要素人像核验接口&#xff0c;被广泛的应用于婚恋、交友、电商等等一系列行业领域&#xff0c;身份证实名认证需要实时数据&#xff0c;对于数据源来说也需要可靠&#xff0c;那么&#xff0c;身份证实名认证的价格是不是很贵呢…

小小算式(1 + 2) * (3 + 4)背后的大道理

目录 前缀表示法&#xff08;波兰表达式&#xff09; 中缀表达法 后缀表达法&#xff08;逆波兰表达式&#xff09; 三种表达法的相互转换 练习&#xff1a;逆波兰表达式求值 前缀表示法&#xff08;波兰表达式&#xff09; 波兰表示法&#xff08;英语&#xff1a;Polis…

Python学习,记录不熟悉知识点

目录 Set&#xff08;集合&#xff09; 集合内置方法完整列表 根据字符串的表达式计算结果 ​编辑 条件控制&#xff1a; if – elif – else match...case 循环语句&#xff1a; while循环 for循环 在同一行中有多个赋值操作&#xff08;先计算&#xff0c;再赋值&…

【Vue】Vue3中的OptionsAPI与CompositionAPI

文章目录 OptionsAPICompositionAPI对比总结 OptionsAPI 中文名:选项式API通过定义methods,computed,watch,data等属性方法&#xff0c;处理页面逻辑。以下是OptionsAPI代码结构 实例代码: <script lang"ts">// js或者tsimport { defineComponent } from vu…

javaScript手写专题——防抖/节流/闭包/Promise/深浅拷贝

目录 目录 一、 防抖/节流/闭包/定时器 编写一个组件&#xff0c;在input中输入文本&#xff0c;在给定的数据中查找相关的项目&#xff0c;并渲染搜索结果列表 1.新增InputSearch.vue组件 key的作用 2.新增 InputView.vue 3.添加路由 4.效果演示 follow up加上防抖怎么处理 1.…

「51媒体网」邀请媒体采访报道对企业宣传有何意义?

传媒如春雨&#xff0c;润物细无声的&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 邀请媒体采访报道对企业宣传具有多重意义&#xff1a; 提升品牌知名度和曝光度&#xff1a;媒体是信息传播的重要渠道&#xff0c;通过媒体的报道&#xff0c;企业及其活动、产品能够迅…

软考信息处理技术员2024年5月报名流程及注意事项

2024年5月软考信息处理技术员报名入口&#xff1a; 中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn/&#xff09; 2024年软考报名时间暂未公布&#xff0c;考试时间上半年为5月25日到28日&#xff0c;下半年考试时间为11月9日到12日。不想错过考试最新消息的…

k8s删除namespace失败一直处于Terminating状态

获取Terminating状态的namespace ~ kubectl get namespace NAME STATUS AGE bluehelix Active 146d broker Active 146d cattle-fleet-cluster…

Sketch是免费软件吗?这款软件支持导入!

Sketch 是一款针对网页、图标、插图等设计的矢量绘图软件。Sketch 的操作界面非常简单易懂&#xff0c;帮助全世界的设计师创作出许多不可思议的作品。但是同时&#xff0c;Sketch 也有一些痛点&#xff1a;使用 Sketch 需要安装 InVision、Abstract 、Zeplin 等插件&#xff0…

配置 施耐德 modbusTCP 分布式IO子站 PRA0100

模块官方介绍&#xff1a;https://www.schneider-electric.cn/zh/product/BMXPRA0100 1. 总体步骤 2. 软件组态&#xff1a;在 Unity Pro 软件中创建编辑 PRA 模块工程 2.1 新建项目 模块箱硬件型号如下 点击 Unity Pro 软件左上方【新建】按钮&#xff0c;选择正确的 DIO …