当前位置: 首页 > 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…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

数据链路层的主要功能是什么

数据链路层&#xff08;OSI模型第2层&#xff09;的核心功能是在相邻网络节点&#xff08;如交换机、主机&#xff09;间提供可靠的数据帧传输服务&#xff0c;主要职责包括&#xff1a; &#x1f511; 核心功能详解&#xff1a; 帧封装与解封装 封装&#xff1a; 将网络层下发…...

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

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

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

C# winform教程(二)----checkbox

一、作用 提供一个用户选择或者不选的状态&#xff0c;这是一个可以多选的控件。 二、属性 其实功能大差不差&#xff0c;除了特殊的几个外&#xff0c;与button基本相同&#xff0c;所有说几个独有的 checkbox属性 名称内容含义appearance控件外观可以变成按钮形状checkali…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...