C++中的类型转换概念详解和示例代码

1.static_cast

static_cast<type>(expression) 是通用的转换形式。可以用于如 intfloat 的转换,void* 到其它类型指针的转换。也可用于指向基类和派生类的指针之间的转换。

int i = 10;
float f = static_cast<float>(i); // int 转换为 floatvoid* pv = &i;
int* pi = static_cast<int*>(pv); // void* 转换为 int* 类型指针

2.dynamic_cast

父类指针可以指向父类对象或子类对象,子类指针不能指向父类对象。这是因为子类对象的内存占用往往大于父类对象,因为子类可能会增加额外的数据成员。

当一个子类对象被赋值给一个父类引用或指针时,这被称为向上转型。当父类指针指向子类对象时,它只能“看到”和操作该对象的父类部分。当试图将父类的指针转型为子类的指针时,这被称为向下转型。向下转型则需要谨慎,如果一个父类指针确实指向了一个子类对象,向下转型是安全的。但如果父类指针仅仅指向一个父类对象,尝试将其转换为子类指针并访问子类特定的成员会导致未定义的行为。所以我们需要使用 dynamic_cast 来进行安全检查。

dynamic_cast<type>(expression) 用于多态类型的安全向下转型。也就是说,它用于将基类的指针或引用转换为派生类的指针或引用,但要求基类至少有一个虚函数。如果转换失败(例如,尝试将基类对象的指针转换为并非实际派生类的派生类指针),dynamic_cast 会返回 nullptr。对于引用的错误,dynamic_cast 会抛出一个 std::bad_cast 异常。例如:

#include <iostream>class Base {
public:virtual void foo() {std::cout << "Base's foo()" << std::endl;}
};class Derived : public Base {
public:void foo() override {std::cout << "Derived's foo()" << std::endl;}void bar() {std::cout << "Derived's bar()" << std::endl;}
};int main() {// 创建一个 Derived 对象Derived d;// 向上转型: 将 Derived 对象当做 Base 对象使用Base* ptrBase = &d;  // 这里进行了向上转型ptrBase->foo();  // 输出 "Derived's foo()"// 创建一个真正的 Base 对象Base b;b.foo();  // 输出 "Base's foo()"// 向下转型: 尝试将 Base 指针转回 Derived 指针Derived* ptrDerived = dynamic_cast<Derived*>(ptrBase);if (ptrDerived) {ptrDerived->bar();  // 输出 "Derived's bar()"}// 尝试错误的向下转型: 使用真正的 Base 对象Derived* wrongDerived = dynamic_cast<Derived*>(&b);if (wrongDerived) {wrongDerived->bar();  // 这里不会被执行} else {std::cout << "Wrong downcasting failed!" << std::endl;  // 输出 "Wrong downcasting failed!"}return 0;
}

输出:

Derived's foo()
Base's foo()
Derived's bar()
Wrong downcasting failed!

3.const_cast

const_cast<type>(expression) 用于删去 const 性质,从而允许修改变量的值。而如果对象是一个常量,使用 const_cast 执行写操作会产生未定义的后果。

const int ci = 10;
int* modifiable = const_cast<int*>(&ci); // 移除 const 属性

4.reinterpret_cast

reinterpret_cast<type>(expression) 在机器和位层次上,重新解释运算对象。例如,可以将一个指针转换为另一个完全不同类型的指针,或者将指针转换为整型。

long l = 0x12345678;
char* cp = reinterpret_cast<char*>(&l); // 将 long* 转换为 char*

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

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

相关文章

数字基础设施及相关产业链报告:数据要素加快推进、AI终端应用加速发展

今天分享的AI系列深度研究报告&#xff1a;《数字基础设施及相关产业链报告&#xff1a;数据要素加快推进、AI终端应用加速发展》。 &#xff08;报告出品方&#xff1a;长城证券&#xff09; 报告共计&#xff1a;16页 1. 行业观点 在 TMT 各子板块&#xff1a;电子、通信、…

【Spring】Spring中的事务

文章目录 1. Spring事务简介2. Spring事务的案例案例代码代码目录结构数据库pom.xmlResource/jdbc.propertiesconfig/SpringConfig.javaconfig/JdbcConfig.javaconfig/MyBatisConfig.javadao/AccountDao.javaservice/AccountService.javaservice/impl/AccountServiceImpl.java测…

关于 scrapy 中 COOKIES_ENABLED 设置

在 Scrapy 框架中&#xff0c;COOKIES_ENABLED True 时&#xff0c;除了可以在 Request 对象中手动设置 cookies 以外&#xff0c;还可以通过修改 DEFAULT_REQUEST_HEADERS 来全局地为每个请求设置 cookies。以下是一个包含这一信息的博客笔记&#xff1a; Scrapy 爬虫中 Cook…

数值的量级

In wordsPrefix (Symbol)DecimalPower of tenOrder of magnitudenonillionthquecto- (q)0.00000000000000000000000000000110−30−30octillionthronto- (r)0.00000000000000000000000000110−27−27septillionthyocto- (y)0.00000000000000000000000110−24−24sextillionthze…

【Mode Management】ComM详细介绍

目录 1. Introduction and functional overview 2.Dependencies to other modules 3.Functional specification 3.1 Partial Network Cluster Management 3.2 ComM channel state machine 3.2.1 Behaviour in state COMM_NO_COMMUNICATION 3.2.1.1 COMM_NO_COM_NO_PENDI…

暂退法(丢弃法)

在深度学习中&#xff0c;丢弃法&#xff08;Dropout&#xff09;是一种常用的正则化技术&#xff0c;旨在减少模型的过拟合现象&#xff0c;可能会比之前的权重衰减(Weight Decay)效果更好。通过在训练过程中随机丢弃一部分神经元&#xff0c;可以有效地减少神经网络中的参数依…

Python实验项目9 :网络爬虫与自动化

实验 1&#xff1a;爬取网页中的数据。 要求&#xff1a;使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 # 要求&#xff1a;使用 urllib 库和 requests 库分别爬取 http://www.sohu.com 首页的前 360 个字节的数据。 import urllib.r…

微服务最佳实践:构建可扩展且高效的系统

微服务架构彻底改变了现代软件开发&#xff0c;提供了无与伦比的敏捷性、可扩展性和可维护性。然而&#xff0c;有效实施微服务需要深入了解最佳实践&#xff0c;以充分发挥微服务的潜力&#xff0c;同时避免常见的陷阱。在这份综合指南中&#xff0c;我们将深入研究微服务的关…

什么是PHP中的PDO事务处理?

在PHP中&#xff0c;PDO&#xff08;PHP Data Objects&#xff09;事务处理是一种数据库操作技术&#xff0c;用于管理数据库连接的事务。事务是一组数据库操作&#xff0c;要么全部成功执行&#xff0c;要么全部失败&#xff0c;保持数据库的一致性和完整性。PDO提供了一种方式…

跟iPhone类似,不同品牌的手机、电脑随时使用“隔空投送”功能!如何开启?

iPhone的隔空投送是一个很受欢迎的功能。打开一个 App&#xff0c;然后轻点“共享”或“共享”按钮&#xff0c;再点击隔空投送&#xff0c;就可以分享图片、视频、文件出去。 然而&#xff0c;如果你用的不是苹果的产品&#xff0c;iPhone的隔空投送功能就有了“隔阂”。 不过…

CountDownLatch实战应用——实现异步多线程业务处理,异常情况回滚全部子线程

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; CountDownLatch实战应用——实现异步多线程业务处理&#xff0c;异常情…

H266/VVC编码标准介绍

视频编码标准 多样的视频应用催生了多种的视频编码方法。为了使编码后的码流能够在大范围内通用和规范&#xff0c;从20世纪80年代开始&#xff0c;国际组织就开始对视频编码建立国际标准。 什么是视频编码标准&#xff1a; 视频编码标准只规定了码流的语法语义和解码器&#…

Appium —— 初识移动APP自动化测试框架Appium

说到移动APP自动化测试&#xff0c;代表性的测试框架非Appium莫属&#xff0c;从今天开始我们将从APP结构解析、Appium框架学习、安卓/iOS自动化测试实战、自动遍历回归测试、自动化测试平台及持续集成&#xff0c;多个维度一起由浅入深的学废Appium 今天我们先来初步认识Appi…

【消息中间件】Rabbitmq的基本要素、生产和消费、发布和订阅

原文作者&#xff1a;我辈李想 版权声明&#xff1a;文章原创&#xff0c;转载时请务必加上原文超链接、作者信息和本声明。 文章目录 前言一、消息队列的基本要素1.队列:queue2.交换机:exchange3.事件:routing_key4.任务:task 二、生产消费模式1.安装pika2.模拟生产者进程3.模…

详解物理机OpenStack连接外部网络网卡配置管理(适用虚拟机)

目录 背景与环境描述 特殊注意事项 Centos7 单网卡场景 多网卡场景 Ubuntu 单网卡场景 多网卡场景 背景与环境描述 本文将从设计和配置两方面详细说明在Centos和Ubuntu两种场景下&#xff0c;allinone部署的OpenStack想要实例能够正常连接外部网络&#xff0c;在网卡上…

【HR培训】行为反馈复盘,走出舒适区--20231217

行为反馈复盘&#xff0c;走出舒适区–鱼缸会议 要点&#xff1a;在于建立平等、透明、敢说的反馈环境&#xff0c;不打断、不争论 鱼缸会议流程 导入——入缸——反馈——承诺——关闭 步骤1&#xff1a;导入 目的&#xff1a;平等、透明、敢说的反馈 人员&#xff1a;主…

maui中实现加载更多 RefreshView跟ListView(1)

效果如图&#xff1a; MainPage.xaml.cs: using System; using System.Collections.ObjectModel; using System.Threading.Tasks; using Microsoft.Maui.Controls; using Microsoft.Maui.Controls.Xaml; using System.ComponentModel; using System.Runtime.CompilerServices…

计算机网络基础——网线认识与制作,线缆类型、线序、端接标准及注意事项

一、引言 网线制作是网络基础知识中不可或缺的。网络传输过程中&#xff0c;网线的质量和制作方法都会直接影响传输的速度和稳定性。本文将详细介绍网线制作的基础知识、线缆类型、线序、端接标准及注意事项。希望通过本文&#xff0c;读者能够更好地了解和掌握网线制作的方法…

sql解析,转换列表和表名

sql解析&#xff0c;转换列表和表名 1、 jsqlparse介绍 JSqlParse是一款很精简的sql解析工具&#xff0c;它可以将常用的sql文本解析成具有层级结构的“语法树”&#xff0c;我们可以针对解析后的“树节点&#xff08;也即官网里说的有层次结构的java类&#xff09;”进行处理…

AMD 自适应和嵌入式产品技术日

概要 时间&#xff1a;2023年11月28日 地点&#xff1a;北京朝阳新云南皇冠假日酒店 主题内容&#xff1a;AMD自适应和嵌入式产品的更新&#xff0c;跨越 云、边、端的AI解决方案&#xff0c;赋能智能制造的机器视觉与机器人等热门话题。 注&#xff1a;本文重点关注FPGA&a…