《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转换为浮点数fclass 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.mzph.cn/pingmian/5856.shtml

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

相关文章

[1678]旅游景点信息Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 旅游景点信息管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql…

【信息系统项目管理师知识点速记】进度管理:排列活动顺序

10.5 排列活动顺序 排列活动顺序是识别和记录项目活动之间关系的过程,主要作用是定义工作之间的逻辑顺序,以在既定的所有项目制约因素下获得最高的效率。本过程需要在整个项目期间开展。 10.5.1 输入 项目管理计划: 进度管理计划:规定了排列活动顺序的方法、准确度和其他…

数据结构:图

数据结构&#xff1a;图 前言 在自动化程序分析中&#xff0c;图和树的一些算法起到了至关重要的作用&#xff0c;所以在开始自动化程序分析的研究前&#xff0c;我用了两天复习了一遍数据结构中的图。本章主要内容有图的基本概念&#xff0c;图的存储和图相关的经典算法&…

OpenCV(二)—— 车牌定位

从本篇文章开始我们进入 OpenCV 的 Demo 实战。首先&#xff0c;我们会用接下来的三篇文章介绍车牌识别 Demo。 1、概述 识别图片中的车牌号码需要经过三步&#xff1a; 车牌定位&#xff1a;从整张图片中识别出牌照&#xff0c;主要操作包括对原图进行预处理、把车牌从整图…

数据结构--顺序表经典OJ题

例1&#xff1a;合并有序顺序表 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递减顺序 排列。 注意&#xff…

测试开发工具开发 -JMeter 函数二次开发

在JMeter中开发自定义函数是一个常见的需求&#xff0c;允许我们扩展JMeter的功能以适应特定的测试需求。自定义函数可以用来处理数据&#xff0c;生成输出&#xff0c;或者执行特定的运算。通过JMeter函数二次开发可以帮我们解决实际测试过程中造数难的问题 用过JMeter的同学…

JAVASE->数据结构|顺序表底层逻辑

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 什么是 List 2. List 常见接口介绍 3. …

java并发编程-AQS介绍及源码详解

介绍 AQS 的全称为 AbstractQueuedSynchronizer &#xff0c;就是抽象队列同步器。 从源码上可以看到AQS 就是一个抽象类&#xff0c;它继承了AbstractOwnableSynchronizer&#xff0c;实现了java.io.Serializable接口。 public abstract class AbstractQueuedSynchronizere…

信号与线性系统 1绪论

信号 信号是随时间变化的某种物理量&#xff08;狭义&#xff09; 本课程中&#xff0c;信号用 函数&#xff08;而且是一维函数&#xff09;表示 连续 离散 信号分类 确定与随机&#xff1a;是否能以确定的时间函数表示离散与连续&#xff1a;是用全体实数还是特定整数来描述…

普乐蛙景区vr体验馆VR游乐场设备身历其境体验

小编给大家推荐一款gao坪效产品【暗黑战车】&#xff0c;一次6人同乘&#xff0c;炫酷外观、强大性能和丰富内容适合各个年龄层客群&#xff0c;紧张刺激的VR体验让玩家沉浸在元宇宙的魅力中&#xff0c;无论是节假日还是平日&#xff0c;景区商场助力门店提高客流量和营收~ ◆…

苹果和OpenAI再续前缘,iOS 18会是颠覆级的吗?|TodayAI

据彭博社最新报道&#xff0c;苹果公司已经与人工智能领域的先锋企业OpenAI重启了对话&#xff0c;双方目前正在讨论一项可能的合作&#xff0c;以将OpenAI的生成式人工智能技术整合到苹果即将推出的iOS 18操作系统中。这一举措表明&#xff0c;苹果正加速其在人工智能技术上的…

Acwing 818. 数组排序

给定一个长度为 n n n的数组 a a a以及两个整数 l l l和 r r r&#xff0c;请你编写一个函数&#xff0c;void sort(int a[], int l, int r)&#xff0c;将 a [ l ] ∼ a [ r ] a[l]∼a[r] a[l]∼a[r]从小到大排序。 输出排好序的数组 a。 输入格式 第一行包含三个整数 n &…

Go Web 开发基础【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

【JavaEE网络】网络编程及其应用概述

目录 面向字节流粘包问题 TCP异常情况TCP/UDP对比 网络层重点协议IP协议IP地址 面向字节流 粘包问题 在面向字节流的情况下&#xff0c;会产生一些其他的问题&#xff1a;粘包问题&#xff0c;这里“粘”的是“应用层数据报”&#xff0c;通过TCP read/write的数据&#xff0…

小米消金持续发力,全面强化金融消费者权益保护措施

近年来&#xff0c;电信网络欺诈手段层出不穷&#xff0c;深度伪造等互联网技术被误用&#xff0c;导致欺诈行为更加隐蔽。重庆小米消费金融有限公司&#xff08;以下简称“小米消金”&#xff09;&#xff0c;作为一家持牌消费金融公司&#xff0c;深知保护消费者财产安全的重…

AI手机,走入小径分岔的花园

博尔赫斯在他的成名作《小径分岔的花园》里&#xff0c;描述了一种奇妙的世界观&#xff1a;一个可能性被选择之后&#xff0c;出现了许多不同的后世&#xff0c;许多不同的时间。 在现实世界中&#xff0c;选择不会如此神奇。但站在岔路口的抉择&#xff0c;也一定会带来结果的…

Mysql的关联查询以及语句

一、mysql的连接查询 1、等值连接 这里是三张表的等值连接 select rp.role_id,rp.permission_id from role_permission rp, role r, permission p where rp.role_idr.id and rp.permission_idp.id 2、内连接&#xff1a; 角色&#xff1a;系统管理员 是否拥有权限&#xf…

实验七 SJK数据库定义与操纵

实验题目 实验七 SJK数据库定义与操纵 实验时间 2023.5.17 实验地点 软件工程基础实验室 实验课时 2 实验目的 ​了解并掌握数据库定义与操纵的知识并能熟练应用 实验要求 ​熟练掌握和使用PL-SQL建立数据库基本表&#xff0c;使用PL/SQL developer操作数据库&a…

C++:现代类型转换

C&#xff1a;现代类型转换 C/C的旧式类型转换C的现代类型转换静态类型转换 static_cast重新解释转换 reinterpret_cast常量类型转换 const_cast动态类型转换 dynamic_cast C/C的旧式类型转换 在C语言中&#xff0c;类型转换被分为显式和隐式&#xff0c;常见的类型转换如下&a…

移动应用开发:Android vs iOS平台的选择与挑战

在移动应用开发领域&#xff0c;选择开发平台是一个关键的决策&#xff0c;通常涉及考虑Android和iOS这两大主流平台。每个平台都有其特定的优势和挑战&#xff0c;开发者需要根据目标市场、预算、功能需求和技术能力来做出选择。 ### Android和iOS的主要差异 1. **市场份额*…