《21天学通C++》(第十三章) 类型转换运算符

1.为什么需要类型转换?

①兼容不同类型: 在C++中不同类型的数据不能直接进行运算,如需要则要进行类型转换

②指针转换: 在处理指针时,经常需要把一个类型的指针转化为另一个类型的指针

③与C语言兼容: C++兼容C语言,有时候需要把C++的类型数据转换为C语言的数据类型

函数重载、类继承、提高表达式性能 、处理多态 、实现特定编程技巧

2.C++有哪些类型转换运算符

①静态类型转换static_cast 主要用于基本数据类型之间的转换,如整数类型到浮点数类型的转换,或者在类层次结构中向上转型(从派生类指针或引用转换为基类指针或引用)。

使用场景
1.基本数据类型转换
2.类层次结构中的向上转型(静态转换用于向下转型不安全

语法

目标类型 命名 = static_cast<目标类型>(表达式)

例子

int i = 10;
float f = static_cast<float>(i); // 将整数i转换为浮点数f

class Base { virtual void dummy() {} };
class Derived : public Base {};

Base* basePtr = new Base();
Derived* derivedPtr = static_cast<Derived*>(basePtr); 
// 向下转型,即基类指针basePtr 转化为派生类指针derivedPtr 

Derived d; // 创建派生类的对象
Base* b = static_cast<Base*>(&d); 
//向上转型,即派生类&d引用转化为基类指针b

②动态类型转换dynamic_cast 它在运行时检查对象的实际类型,以确定转换是否有效,主要用于涉及多态性的类层次结构中,尤其是在需要将基类指针或引用安全地转换为派生类指针或引用时。

使用场景
1.向下转型(可以检查是否成功,所以比静态类型安全)
2.实现多态性

语法

目标类型 命名 = dynamic_cast<目标类型>(表达式)

例子

class Base {public: virtual ~Base() {}};
class Derived : public Base {};

Base* basePtr = new Derived();  // 基类指针实际上指向一个派生类对象

// 向下转型为派生类指针
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr != nullptr) {
    // 如果转换不可能
    //指针类型的dynamic_cast会返回nullptr
    //引用类型的dynamic_cast会抛出std::bad_cast异常。
} else {
    // 转换失败,basePtr实际上不指向Derived类型的对象
}
// 释放内存
delete basePtr;

PS:
1.务必检查dynamic_cast的返回值,看是否转化成功
2.dynamic_cast只能应用于含有虚函数的类,因为它们需要运行时类型信息(RTTI)来确定对象的实际类型。

③重新解释类型转换reinterpret_cast 它允许将一个指针或引用重新解释为完全不同的另一种类型的指针或引用,在某些特定的低级编程任务中,如直接操作内存或与 C 语言代码交互时可能会用到。

使用场景
1.指针类型之间的转换
2.函数指针之间的转换
3.整数和指针之间的转换
4.类成员指针之间的转换

语法

目标类型 命名 = reinterpret_cast<目标类型>(表达式)

例子

int* p = new int(65);

char* ch = reinterpret_cast<char*>(p);// 将 int* 转化为 char*
int* p2 = reinterpret_cast<int*>(ch);// 将 char* 转化为 int*,

// 将函数指针转换为 void* 类型指针
void (*funcPtr)() = someFunction;
void* pVoidFunc = reinterpret_cast<void*>(funcPtr);

④常量类型转换const_cast 用于修改const,让原本不允许修改的常量对象可以进行修改,或者让原本不允许被视作常量的对象被视作常量。

语法

目标类型 命名 = const_cast<目标类型>(表达式)

使用场景
1.移除 const

例子

const int ci = 10;
int* modifiable = const_cast<int*>(ci);  // 移除 const,现在可以通过 modifiable 修改 ci 的值

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react核心知识

1. 对 React 的理解、特性 React 是靠数据驱动视图改变的一种框架&#xff0c;它的核心驱动方法就是用其提供的 setState 方法设置 state 中的数据从而驱动存放在内存中的虚拟 DOM 树的更新 更新方法就是通过 React 的 Diff 算法比较旧虚拟 DOM 树和新虚拟 DOM 树之间的 Chan…

【PCL】教程 supervoxel_clustering执行超体聚类并可视化点云数据及其聚类结果

[done, 417.125 ms : 307200 points] Available dimensions: x y z rgba 源点云milk_cartoon_all_small_clorox.pcd > Loading point cloud... > Extracting supervoxels! Found 423 supervoxels > Getting supervoxel adjacency 这段代码主要是使用PCL&#xff08;Po…

Linux进程——进程的创建(fork的原理)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法&#xff0c;以及如何创建子进程&#xff01; 本篇主要内容&#xff1a; 查看进程的第二种方法创建子进程系统调用函数fork 在开始前&#xff…

【华为】路由综合实验(基础)

【华为】路由综合实验 实验需求拓扑配置AR1AR2AR3AR4AR5PC1PC2 查看通信OSPF邻居OSPF路由表 BGPBGP邻居BGP 路由表 配置文档 实验需求 ① 自行规划IP地址 ② 在区域1里面 启用OSPF ③ 在区域1和区域2 启用BGP&#xff0c;使AR4和AR3成为eBGP&#xff0c;AR4和AR5成为iBGP对等体…

buuctf-misc-22.神秘龙卷风1

22.神秘龙卷风1 题目&#xff1a;暴力破解-翻译Brainfuck计算机语言 根据提示是4位密码&#xff0c;直接破解密码即可 解压后发现是这样一个文档 我们尝试使用网站翻译这个 内容由“”、“.”、“>”三种符号组成&#xff0c;我刚开始认为这是一种密文&#xff0c;经过搜索…

thinkpad电脑文件隐藏了怎么恢复?教你几招

在使用ThinkPad电脑时&#xff0c;有时我们可能会发现一些文件或文件夹突然“消失”了&#xff0c;这通常是因为它们被隐藏了。本文将为您介绍几招恢复ThinkPad电脑上隐藏文件的方法&#xff0c;帮助您轻松找回丢失的文件。 图片来源于网络&#xff0c;如有侵权请告知 一、了解…

【实时数仓架构】方法论

笔者不是专业的实时数仓架构&#xff0c;这是笔者从其他人经验和网上资料整理而来&#xff0c;仅供参考。写此文章意义&#xff0c;加深对实时数仓理解。 一、实时数仓架构技术演进 1.1 四种架构演进 1&#xff09;离线大数据架构 一种批处理离线数据分析架构&#xff0c;…

when to create a ViewRootImpl

when to create a ViewRootImpl when method setView is called: when method dispatchDetachedFromWindow is called:

预训练模型介绍

一、什么是GPT GPT 是由人工智能研究实验室 OpenAI 在2022年11月30日发布的全新聊天机器人模型, 一款人工智能技术驱动的自然语言处理工具 它能够通过学习和理解人类的语言来进行对话, 还能根据聊天的上下文进行互动,能完成撰写邮件、视频脚本、文案、翻译、代码等任务 二、 为…

TypeScript学习笔记:迈向更安全的JavaScript编程

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Linux专栏05:Linux基本指令之目录处理指令

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux基本指令之目录处理指令 编号&#xff1a;05 文章目录 Linux基…

STM32之HAL开发——电容按键

电容按键原理 电容器 (简称为电容) 就是可以容纳电荷的器件&#xff0c;两个金属块中间隔一层绝缘体就可以构成一个最简单的电容。如图 32_1 (俯视图)&#xff0c;有两个金属片&#xff0c;之间有一个绝缘介质&#xff0c;这样就构成了一个电容。这样一个电容在电路板上非常容…

线程同步与条件变量

再论生产消费者问题 问题 如果缓冲池为空&#xff0c;如何定义消费者的行为? 一种可能的解决方案 这种方案是可行的&#xff0c;但是如果生产者一直不生产&#xff0c;那么消费者会反复查看产品的数量为 0 并休眠&#xff0c;这样会浪费 cpu 的资源&#xff0c;并且生产者生产…

MWCNTs微纳米纤维膜的制备

MWCNTs微纳米纤维膜是一种由多壁碳纳米管&#xff08;MWCNTs&#xff09;与聚合物纤维复合而成的纳米纤维膜。这种材料结合了MWCNTs的良好性能和纳米纤维膜的高比表面积、高通量等特点&#xff0c;具有广泛的应用前景。 在制备过程中&#xff0c;首先需要对MWCNTs进行酸化处理和…

基于SpringBoot的私人健身与教练预约管理系统设计与实现

一、引言 私人健身与教练预约管理系统&#xff0c;可以摆脱传统手写记录的管理模式。利用计算机系统&#xff0c;进行用户信息、管理员信息的管理&#xff0c;其中包含首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;教练管理&#xff0c;健身项目管理&#xff0c;项…

Agent AI智能体:如何借助机器学习引领科技新潮流

文章目录 &#x1f4d1;前言一、Agent AI智能体的基本概念二、Agent AI智能体的技术进步2.1 机器学习技术2.2 自适应技术2.3 分布式计算与云计算 三、Agent AI智能体的知识积累3.1 知识图谱3.2 迁移学习 四、Agent AI智能体的挑战与机遇4.1 挑战4.2 机遇 小结 &#x1f4d1;前言…

Linux下安装snaphu

1、官网下载安装包 2、解压&#xff0c;移动文件夹到/usr/local/下 3、在/usr/local/下创建man&#xff0c;在man下创建man1文件夹 4、进入到snaphu的src文件夹里&#xff0c;执行sudo make&#xff0c;如果报错 在这个 Makefile 中&#xff0c;-arch x86_64 是 macOS 特定的…

小区服务|基于SprinBoot+vue的小区服务管理系统(源码+数据库+文档)

目录 基于SprinBootvue的小区服务管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员登录 2 客服聊天管理、反馈管理管理 3 公告信息管理 4公告类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博…

图论之最短路算法模板总结

来个大致的分类&#xff1a; 朴素的迪杰斯特拉&#xff1a; 实现&#xff1a; 我们让s表示当前已经确定的最短距离的点&#xff0c;我们找到一个不在s中的距离最近的点t&#xff0c;并用t来更新其他的点。 下面是AC代码&#xff1a; #include<bits/stdc.h> using nam…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…
最新文章