当前位置: 首页 > news >正文

C++学习之强制类型转换

强制类型转换运算符

带着三个疑问阅读:

  1. 出现的背景是什么?
  2. 何时使用?
  3. 如何使用?

MSDN . 强制转换运算符
C++中的四种强制类型转换符详解

static_cast

(1) 使用场景

  • 在基本数据类型之间转换,如把 int 转换为 char,这种带来安全性问题由程序员来保证;
  • 在有类型指针与 void * 之间转换;
  • 用于类层次结构中基类和派生类之间指针或引用的转换。
    • 上行转换(派生类---->基类)是安全的;
    • 下行转换(基类---->派生类)由于没有动态类型检查,所以是不安全的。

(2) 使用特点

  • 主要执行非多态的转换操作,用于代替C中通常的转换操作。
  • 隐式转换都建议使用 static_cast 进行标明和替换。
  • 不能使用 static_cast 在有类型指针内转换。

dynamic_cast

(1) 使用场景

  • 用于将一个父类的指针/引用转化为子类的指针/引用(下行转换)

(2) 使用特点

  • 基类必须要有虚函数,因为 dynamic_cast 是运行时类型检查,需要运行时类型信息,而这个信息是存储在类的虚函数表中。
  • 对于下行转换,dynamic_cast 是安全的(当类型不一致时,转换过来的是空指针),而 static_cast 是不安全的。
  • 对指针进行 dynamic_cast,失败返回 NULL,成功返回正常 cast 后的对象指针;对引用进行 dynamic_cast,失败抛出一个异常,成功返回正常 cast 后的对象引用。

const_cast

(1) 使用场景

  • 常量指针(或引用)与非常量指针(或引用)之间的转换。

(2) 使用特点

  • cosnt_cast 是四种类型转换符中唯一可以对常量进行操作的转换符。
  • 去除常量性是一个危险的动作,尽量避免使用。

reinterpret_cast

(1) 使用场景

  • 用在任意指针(或引用)类型之间的转换。
  • 能够将整型转换为指针,也可以把指针转换为整型或数组。

(2) 使用特点

  • reinterpret_cast 是从底层对数据进行重新解释,依赖具体的平台,可移植性差。不到万不得已,不用使用这个转换符,高危操作

示例程序

#include <iostream>namespace staticCast{
/*** @brief static_cast的使用场景* 1. 使用static_cast在基本数据类型之间转换* 2. 使用static_cast在有类型指针与void *之间转换* 3. 用于类层次结构中基类和派生类之间指针或引用的转换*/class CBase // 基类(父类)
{};class CDerived : public CBase  // 派生类(子类)
{};int useof_static_cast()
{// 1. 使用static_cast在基本数据类型之间转换float fval = 10.12;int ival = static_cast<int>(fval);  // float --> intstd::cout << ival << std::endl;  // out: 10// 2. 使用static_cast在有类型指针与void *之间转换int *intp = &ival;void *voidp = static_cast<void *>(intp); // int* --> void*// cout << *voidp << endl; // error,voidp的大小未知long *longp = static_cast<long *>(voidp);std::cout << *longp << std::endl; // out: 10// 3. 用于类层次结构中基类和派生类之间指针或引用的转换// 上行转换(派生类---->基类)是安全的CDerived *tCDerived1 = nullptr;CBase *tCBase1 = static_cast<CBase*>(tCDerived1);// 下行转换(基类---- > 派生类)由于没有动态类型检查,所以是不安全的CBase *tCBase2 = nullptr;CDerived *tCDerived2 = static_cast<CDerived*>(tCBase2); //不会报错,但是不安全// 4. 不能使用static_cast在有类型指针内转换float *floatp = &fval;  //10.12的addr//int *intp1 = static_cast<int *>(floatp); // error,不能使用static_cast在有类型指针内转换std::cout << *floatp << std::endl;    // out: 10.12
}
}// namespace staticCastnamespace dynamicCast{/*** @brief dynamic_cast使用* 1. 用于将一个父类的指针/引用转化为子类的指针/引用(下行转换)* 2. 当某个成员函数只在子类中存在,父类指针指向子类对象。此时该指针想要使用子类的成员函数,需要将父类指针转换为子类指针*/
class CBase    // 基类(父类)
{
public:// dynamic_cast在将父类cast到子类时,父类必须要有虚函数virtual int test() { return 0; } // 一定要是 virtual
};class CDerived : public CBase  // 派生类(子类)
{
public:int test() { return 1; }
};int useof_dynamic_cast()
{CBase *p_CBase = new CBase;  // 基类对象指针CDerived *p_CDerived = dynamic_cast<CDerived *>(p_CBase);  // 将基类对象指针类型转换为派生类对象指针CBase i_CBase;    // 创建基类对象CBase &r_CBase = i_CBase;    // 基类对象的引用CDerived &r_CDerived = dynamic_cast<CDerived &>(r_CBase);  // 将基类对象的引用转换派生类对象的引用
}
} //namespace dynamicCastnamespace constCast
{
/*** @brief const_cast的使用* **/
int useof_const_cast()
{int value = 100;const int *cpi = &value; // 定义一个常量指针//*cpi = 200;   // 不能通过常量指针修改值// 1. 将常量指针转换为非常量指针,然后可以修改常量指针指向变量的值int *pi = const_cast<int *>(cpi);*pi = 200;// 2. 将非常量指针转换为常量指针const int *cpi2 = const_cast<const int *>(pi); // *cpi2 = 300;  //已经是常量指针const int value1 = 500;const int &c_value1 = value1; // 定义一个常量引用// 3. 将常量引用转换为非常量引用int &r_value1 = const_cast<int &>(c_value1);// 4. 将非常量引用转换为常量引用const int &c_value2 = const_cast<const int &>(r_value1);
}  
} // namespace constCastnamespace reinterpretCast
{
int useof_reinterpret_cast()
{int value = 100;// 1. 用在任意指针(或引用)类型之间的转换double *pd = reinterpret_cast<double *>(&value);std::cout << "*pd = " << *pd << std::endl;// 2. reinterpret_cast能够将指针值转化为整形值int *pv = &value;int pvaddr = reinterpret_cast<int>(pv);std::cout << "pvaddr = " << pvaddr << std::endl;std::cout << "pv = " << pv << std::endl;
}} // namespaceCastint main(int argc, char* argv[])
{staticCast::useof_static_cast();dynamicCast::useof_dynamic_cast();constCast::useof_const_cast();reinterpretCast::useof_reinterpret_cast();
}

相关文章:

C++学习之强制类型转换

强制类型转换运算符 带着三个疑问阅读&#xff1a; 出现的背景是什么&#xff1f;何时使用&#xff1f;如何使用&#xff1f; MSDN . 强制转换运算符 C中的四种强制类型转换符详解 static_cast (1) 使用场景 在基本数据类型之间转换&#xff0c;如把 int 转换为 char&#…...

在Linux中,可以使用以下命令来查看进程

在Linux中&#xff0c;可以使用以下命令来查看进程&#xff1a; ps 命令&#xff1a;显示当前用户的进程状态。 ps&#xff1a;显示当前终端会话中正在运行的进程。ps aux&#xff1a;显示系统中所有正在运行的进程&#xff0c;包括其他用户的进程。ps -ef&#xff1a;显示系统…...

【算法训练-动态规划 一】【应用DP问题】零钱兑换、爬楼梯、买卖股票的最佳时机I、打家劫舍

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【动态规划】&#xff0c;使用【数组】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条件为&…...

2023年中职组“网络安全”赛项云南省竞赛任务书

2023年中职组“网络安全”赛项 云南省竞赛任务书 一、竞赛时间 总计&#xff1a;360分钟 竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 A模块 A-1 登录安全加固 180分钟 200分 A-2 本地安全策略配置 A-3 流量完整性保护 A-4 事件监控 A-5 服务加固…...

Modeling Deep Learning Accelerator Enabled GPUs

Modeling Deep Learning Accelerator Enabled GPUs 发表在 ISPASS 2019 上。文章研究了 NVIDIA 的 Volta 和 Turing 架构中张量核的设计&#xff0c;并提出了 Volta 中张量核的架构模型。 基于 GPGPU-Sim 实现该模型&#xff0c;并且支持 CUTLASS 运行。发现其性能与硬件非常吻…...

《动手学深度学习 Pytorch版》 9.5 机器翻译与数据集

机器翻译&#xff08;machine translation&#xff09;指的是将序列从一种语言自动翻译成另一种语言&#xff0c;基于神经网络的方法通常被称为神经机器翻译&#xff08;neural machine translation&#xff09;。 import os import torch from d2l import torch as d2l9.5.1 …...

网络入门基础

网络入门基础 文章目录 网络入门基础网络的发展协议的概念网络协议初识协议分层层状结构OSI七层模型TCP/IP五层(或四层)模型TCP/IP模型和计算机软硬体系结构的关系 网络传输基本流程同局域网的两台主机通信不同局域网的两台主机通信 网络中的地址管理认识IP地址认识MAC地址 网络…...

Towards a Rigorous Evaluation of Time-series Anomaly Detection(论文翻译)

1 Introduction 随着工业4.0加速系统自动化&#xff0c;系统故障的后果可能会产生重大的社会影响&#xff08;Baheti和Gill 2011; Lee 2008; Lee&#xff0c;Bagheri和Kao 2015&#xff09;。为了防止这种故障&#xff0c;检测系统的异常状态比以往任何时候都更加重要&#xff…...

理解Python装饰器

本文将从多个方面对Python装饰器进行详细的阐述&#xff0c;并给出完整的代码示例。 一、装饰器的概念 装饰器是Python中非常重要的概念&#xff0c;它可以在不修改函数本身的情况下对函数的功能进行扩展或修改。装饰器本质上是一个函数&#xff0c;它接收一个函数作为参数&a…...

VR智慧景区,为游客开启智慧旅游新时代

近年来&#xff0c;文旅部加强了5G、VR虚拟技术等在文旅产业行业的运用&#xff0c;随着科技的不断发展&#xff0c;VR技术的运用越来越广泛&#xff0c;VR智慧景区作为一种全新的旅游方式&#xff0c;也渐渐的受到了人们广泛的关注&#xff0c;它可以让人们足不出户就欣赏到各…...

蓝桥杯 Java 青蛙过河

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改/**二分法从大&#xff08;n&#xff09;到小找足够小的步长前缀和记录每个位置的前面有的总石头数&#xff08;一个石头表示可以容纳一个青蛙&#xff0c;一位置有多少个石头hi就是多少&#xff09;&…...

雷达图应该如何去绘制?

雷达图&#xff08;又称为蜘蛛网图、星形图&#xff09;是一种用来显示多变量数据的图表&#xff0c;它可以直观地展示出数据在多个维度上的表现。雷达图中&#xff0c;每个轴代表一个维度&#xff0c;所有的轴都从中心点射出并均匀分布在圆周上&#xff0c;形成一个星形。每个…...

1024 蓝屏漏洞攻防战(第十九课)

1024 蓝屏漏洞攻防战(第十九课) 思维导图 一 永恒之蓝的介绍 漏洞为外界所知源于勒索病毒的爆发,该病毒利用NSA(美国国家安全局)泄露的网络攻击工具 永恒之蓝( EternalBlue )改造而成,漏洞通过TCP的445和139端口,利用SMB远程代码执行漏洞,攻击者可以在目标系统上执行…...

短视频矩阵系统软件源码

短视频矩阵系统软件源码 视频成为获得免费流量最便宜的渠道&#xff0c;平台给所有视频最基础的保底流量。如果按照一个视频最低500流量计算&#xff0c;5个账户就是2500的流量&#xff0c;200个视频就是50W流量&#xff0c;如果从其他渠道获得50W流量是个很困难的事情。短视频…...

内网穿透的应用-如何通过TortoiseSVN+内网穿透,实现公网提交文件到内网SVN服务器?

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统&#xff0c;它与Apache Subversion&#xff08;SVN&#xff09;集成在一起&#xff0c;提供了一个用户友好的界面&#xff0c;方便用…...

有没有PC端的配音软件推荐?(免下载)

配音软件还是电脑上使用最方便&#xff0c;而且电脑上可以使用的配音软件也非常多。只是你平时使用的不多&#xff0c;所有想用的时候才会找不到&#xff0c;对于经常使用配音软件的人来说&#xff0c;那真的太多了。今天给大家推荐一个免下载的配音网站&#xff0c;微信扫码即…...

clickhouse

官方链接 <insert id"insertTable" parameterType"com.ioc.orm.ck.model.TableModel">insert into table_name<trim prefix"(" suffix")" suffixOverrides","><if test"ts ! null">ts,</if…...

linux下创建文件夹软链接

软链接&#xff1a; 软链接是Linux下常用的一种共享文件方式、目录的方式&#xff0c;这种方式类似于Windows下的快捷方式。一般一个文件或者目录在不同的路径都需要的时候&#xff0c;可以通过创建软链接的方式来共享&#xff0c;这样系统下面只有一份源文件、目录。另外&…...

常用的工具网站

1.免费的在线pdf解密网站&#xff1a;https://smallpdf.com/unlock-pdf 2.常用的梯子登录页面&#xff1a;https://3.akkcloud1.com/auth/login 3.chatgpt登录页面&#xff1a;https://chat.openai.com/auth/login 4.国外短信收发平台&#xff1a;https://sms-activate.org/cn/…...

号外!百度Comate代码助手全新上线SaaS服务 - 免费申请试用+深入教程解读!

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...