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

C++中的四种类型转换(Type Casting)方式

在C++中,有四种常见的类型转换(Type Casting)方式,它们分别是:

一、静态转换(Static Cast):

static_cast是最常见的类型转换方式,用于基本数据类型的转换、非多态类型之间的转换以及显示地转换指针或引用类型。
它在编译时进行类型检查,无需运行时支持,因此效率较高,但类型安全性需要由程序员负责。
静态转换不能用于多态类型的向上转换或向下转换(需要使用动态转换)。

示例代码:

int num = 10;
double converted = static_cast<double>(num);int intValue = 65;
char charValue = static_cast<char>(intValue);Base* basePtr = new Derived();
Derived* derivedPtr = static_cast<Derived*>(basePtr);

二、动态转换(Dynamic Cast):

dynamic_cast用于处理多态类型的转换(指向基类的指针或引用)。
它在运行时进行类型检查,用于安全地进行向上转换和向下转换。如果转换无效,它返回空指针(对指针)或引发std::bad_cast异常(对引用)。
使用动态转换需要将基类声明为多态类型(至少一个虚函数)。

示例代码:

class Base
{
public:virtual ~Base() {}
};class Derived : public Base
{
public:void someFunction() {}
};Base* basePtr = new Derived();// 向下转换
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr != nullptr)
{// 转换成功derivedPtr->someFunction();
}
else
{// 转换失败std::cout << "Dynamic cast failed.\n";
}

三、重新解释转换(Reinterpret Cast):

reinterpret_cast用于低级别的类型转换,可以将指针或引用转换为其他类型的指针或引用,即使这种转换在类型间没有实际关联。
它能够将一个指针转换为一个整数类型,或将一个整数类型转换为一个指针。
它是一种危险的转换方式,需要慎重使用,并且通常用于处理底层的编程场景。

示例代码:

int num = 10;
int* numPtr = &num;
intptr_t address = reinterpret_cast<intptr_t>(numPtr);int intValue = 65;
char* charPtr = reinterpret_cast<char*>(&intValue);

四、常量转换(Const Cast):

const_cast用于移除对象的常量性(const)或添加常量性。
通常用于去除函数的常量性,以便对其进行修改。
值得注意的是,使用const_cast去除常量性并修改一个本来就是常量的变量是未定义行为,这可能导致意外结果。

示例代码:

const int num = 10;
int* mutablePtr = const_cast<int*>(&num);
*mutablePtr = 20; // 未定义行为const char* constantStr = "Hello";
char* mutableStr = const_cast<char*>(constantStr);
mutableStr[0] = 'h';

这些示例代码用于展示各种转换方式的用法,并不代表在所有情况下都是适当的。在实际应用中,请谨慎选择和使用类型转换,以确保类型安全和正确性。

相关文章:

C++中的四种类型转换(Type Casting)方式

在C中&#xff0c;有四种常见的类型转换&#xff08;Type Casting&#xff09;方式&#xff0c;它们分别是&#xff1a; 一、静态转换&#xff08;Static Cast&#xff09;&#xff1a; static_cast是最常见的类型转换方式&#xff0c;用于基本数据类型的转换、非多态类型之间…...

Linux系列:从0到1用Docker部署springboot项目

目录 1.前提条件 2.编写DockerFile镜像文件 3.打包SpringBoot项目 4.通过软件Xftp进行传输&#xff08;*&#xff09; 1.点击“文件-新建”​编辑 5.操作远程主机 1.docker构建 2.容器运行 6.容器的关闭和删除 1.前提条件 Linux、docker、xftp的安装、一台可以访问的远…...

zabbix监控mysql数据库、nginx、Tomcat

文章目录 一.zabbix监控mysql数据库1.环境规划2.zabbix-server安装部署&#xff08;192.168.198.17&#xff09;3.zabbix-mysql安装部署&#xff08;192.168.198.15&#xff09;3.1 部署 zabbix 客户端3.2 服务端验证 zabbix-agent2 的连通性&#xff08;192.168.198.17&#x…...

深入探索二叉树算法:理解、构建和应用C语言

引言 二叉树是计算机科学中的一种重要数据结构&#xff0c;它在各种算法和应用中都扮演着重要角色。本篇博客将带您深入探索二叉树的世界&#xff0c;从基本概念到高级应用&#xff0c;逐步展开二叉树的奥秘&#xff0c;助您更好地理解、构建和应用二叉树算法。 什么是二叉树…...

(css)点击前隐藏icon图表 点击后显示

(css)点击前隐藏icon图表 点击后显示 效果 html <liv-for"(item,index) in sessionList":key"index"class"liClass":class"{ active: change2 index }"tabindex"2">...<el-tooltip class"item" effec…...

Tomcat的动静分离以及多实例部署

一、动静分离 Nginx实现负载均衡的原理&#xff1a; Nginx实现负载均衡是通过反向代理实现Nginx服务器作为前端&#xff0c;Tomcat服务器作为后端&#xff0c;web页面请求由Nginx服务来进行转发。 但不是把所有的web请求转发&#xff0c;而是将静态页面请求Ncinx服务器自己来处…...

uniapp+vue3项目中使用vant-weapp

创建项目 通过vue-cli命令行创建项目 Vue3/Vite版要求 node 版本^14.18.0 || >16.0.0 uni-app官网 (dcloud.net.cn) npx degit dcloudio/uni-preset-vue#vite my-vue3-project打开项目 点击顶部菜单栏终端/新建终端 执行安装依赖指令 yarn install 或 npm install 安装vant…...

WordPress:实现发布文章自动添加TAG标签

在给我们的WordPress博客更新文章时&#xff0c;大多数人应该会给文章添加一些TAG标签&#xff0c;文章添加TAG标签也是我们做WordPress优化必不可少的一项&#xff0c;但是如果每一篇文章的关键字标签都要手动添加链接&#xff0c;那也太麻烦了。今天给大家分享一篇自动给文章…...

ubuntu下FFmpeg安装和使用以及CMakeLists.txt模板

sudo apt install ffmpeg sudo apt-get install libavfilter-devcmakelist模板 CMakeLists.txt cmake_minimum_required(VERSION 3.16) project(ffmpeg_demo)# 设置ffmpeg依赖库及头文件所在目录&#xff0c;并存进指定变量 set(ffmpeg_libs_DIR /usr/lib/x86_64-linux-gnu) …...

数据结构顺序表和链表(超详细)

线性表&#xff1a; 线性表 &#xff08; linear list &#xff09; 是 n 个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使 用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串 ... 线性表在逻辑上是线性结构&#xff0c;也就…...

free 查看 buff/cache 很大,处理方法

如果 free 命令输出中的 buff/cache 很大&#xff0c;这意味着系统将一部分内存用于缓存文件系统的数据。这是正常的行为&#xff0c;因为缓存可以提高文件访问的速度。然而&#xff0c;如果需要释放缓存来腾出内存空间&#xff0c;可以尝试以下方法&#xff1a; 清理 PageCach…...

【Quarkus技术系列】「云原生架构体系」在云原生时代下的Java“拯救者”是Quarkus,那云原生是什么呢?

云原生时代下的Java"拯救者" 在云原生时代&#xff0c;其实Java程序是有很大的劣势的&#xff0c;以最流行的spring boot/spring cloud微服务框架为例&#xff0c;启动一个已经优化好&#xff0c;很多bean需要lazy load的application至少需要3-4秒时间&#xff0c;内…...

DHCP的工作原理

DHCP是一种网络管理协议&#xff0c;全称为动态主机配置协议&#xff08;Dynamic Host Configuration Protocol&#xff09;。它是一种基于TCP/IP协议的网络服务&#xff0c;允许网络管理员集中管理和分配IP地址和其他网络配置参数&#xff0c;以便客户端设备能够使用这些参数与…...

display:flex;兼容浏览器写法

通过在 display 属性中使用这些不同的值&#xff0c;可以确保在各种浏览器中都能正确显示 flex 布局。 需要注意的是&#xff0c;这只是一个示例&#xff0c;实际使用时可能还需要考虑其他兼容性问题&#xff0c;并根据具体情况进行调整。如果你需要更全面的兼容性解决方案&am…...

三、python Django ORM postgresql[数据定时备份、数据恢复]

一、数据定时备份 解释&#xff1a;备份指定数据库&#xff0c;能有效在发生错误时&#xff0c;预防错误&#xff0c;进行恢复 1.基本备份 #!/bin/bash sudo -u postgres pg_dump -U postgres -d dbname -Fc > /home/postgres/backup/backup.dump # sudo -u postgres&…...

c++字符串函数

在 C 中有大量用于操作 C-style 字符串的函数&#xff0c;它们集成在头文件 <cstring> 中。其常见的函 函数作用strcpy(s1,s2) 复制字符串 s2 到 s1strcat(s1,s2) 将字符串 s2 连接到 s1 末尾strlen(s) 计算字符串 s 长度strcmp(s1,s2) 比较字符串 s1 和 s2 …...

使用OkHttp发送POST请求的几种方式

使用OkHttp发送POST请求的几种方式 介绍pom依赖基本的POST请求带授权的POST请求POST方式发送JSON数据Multipart POST 请求 介绍 本文将介绍 OkHttp 客户端的基本用法。 主要介绍 OkHttp 3.x 版本中发送Post请求的几种方式。 pom依赖 <dependency><groupId>com.sq…...

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比

时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比 目录 时序预测 | MATLAB实现EEMD-GRU、GRU集合经验模态分解结合门控循环单元时间序列预测对比效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 1.MATLAB实现EEMD-GRU、GRU时…...

学习笔记整理-JS-04-流程控制语句

文章目录 一、条件语句1. if语句的基本使用2. if else if多条件分支3. if语句算法题4. switch语句5. 三元运算符 二、循环语句1. for循环语句2. for循环算法题3. while循环语句4. break和continue5. do while语句 三、初识算法1. 什么是算法2. 累加器和累乘器3. 穷举法4. 综合算…...

stable-diffusion-webui 界面汉化

本教程通过安装 sd-webui-bilingual-localization 插件来达到汉化目的, 项目地址为:https://github.com/journey-ad/sd-webui-bilingual-localization 一、安装插件 先进入插件安装界面 在搜索栏搜索 zh_CN Localization 中文语言包, 项目地址: https://github.com/dtlnor/st…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

wpf在image控件上快速显示内存图像

wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像&#xff08;比如分辨率3000*3000的图像&#xff09;的办法&#xff0c;尤其是想把内存中的裸数据&#xff08;只有图像的数据&#xff0c;不包…...

SQL Server 触发器调用存储过程实现发送 HTTP 请求

文章目录 需求分析解决第 1 步:前置条件,启用 OLE 自动化方式 1:使用 SQL 实现启用 OLE 自动化方式 2:Sql Server 2005启动OLE自动化方式 3:Sql Server 2008启动OLE自动化第 2 步:创建存储过程第 3 步:创建触发器扩展 - 如何调试?第 1 步:登录 SQL Server 2008第 2 步…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...

基于鸿蒙(HarmonyOS5)的打车小程序

1. 开发环境准备 安装DevEco Studio (鸿蒙官方IDE)配置HarmonyOS SDK申请开发者账号和必要的API密钥 2. 项目结构设计 ├── entry │ ├── src │ │ ├── main │ │ │ ├── ets │ │ │ │ ├── pages │ │ │ │ │ ├── H…...