【C++】C++的四种类型转换

一、C语言中的类型转换

在C语言中有两种类型转换,隐式类型转换和显示类型转换。

如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。

隐式类型转换:是编译器在编译期间自动转换,不能转就报错。

显式类型转换:用户自己转换。

int x = 1;
//隐式类型转换
double y = x;
cout << y << endl;int* p = &x;
//用户自己显示类型转换
int addr = (int)p;
cout << addr << endl;

二.C++需要四种强制类型转换的理由

在C语言中有很多类型转换的可视性不是很好或者存在精度问题,如以下可视性例子:

三.C++中四种强制类型转换

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符。

1.static_cast

static_cast多用于静态转换,简单说就是用于两个相关类型

int x = 1;
double y = static_cast<double>(x);
cout << y << endl;

2.reinterpret_cast

reinterpret_cast用于处理不同类型之间的转换。可以将一个指针或引用转换为另一种类型,且不需要进行任何类型检查或安全检查。

int* p = &x;
int addr = reinterpret_cast<int>(p);
cout << addr << endl;

3.const_cast

const_cast用于去除变量的const属性。

	volatile const int i = 0;int* p = const_cast<int*>(&i);*p = 19;cout << i << endl;cout << *p << endl;

4.dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)

向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)

向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

注意:

1. dynamic_cast只能用于父类含有虚函数的类

2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr或者抛异常

#include <iostream>class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void show() {std:: cout << "Derived class" << std::endl;}
};int main() {Base* basePtr = new Derived;Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if(derivedPtr) {derivedPtr->show(); // 输出:Derived class} else {std::cout << "Failed to cast to Derived class" << std::endl;}delete basePtr;return 0;
}

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

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

相关文章

autodl私有云使用方法(成员端使用)

此时找管理员添加进团队&#xff0c;https://private.autodl.com/访问&#xff0c;登录账号。可以看到容器实例。 点击创建实例&#xff0c;根据所需创建。版本号不可以超过最高的CUDA支持&#xff0c;可以自己拉取镜像。 此处需要注意数据盘使用量&#xff0c;密切关注。存取传…

【WEB前端2024】开源元宇宙:乔布斯3D纪念馆-第10课-摆件的交互

【WEB前端2024】开源元宇宙&#xff1a;乔布斯3D纪念馆-第10课-摆件的交互 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&am…

Erupt Framework:革命性的通用配置管理框架,零前端代码,急速开发通用管理系统

Erupt Framework&#xff1a;革命性的通用配置管理框架&#xff0c;零前端代码&#xff0c;急速开发通用管理系统 摘要 随着技术的快速发展&#xff0c;软件开发的效率和质量成为了企业竞争的关键因素。Erupt&#xff0c;作为一个低代码全栈框架&#xff0c;通过注解的方式动…

光透过率检测仪解析

TH-SGT1便携式隧道光透过率检测仪是一种用于快速、准确地测量隧道内光透过率的设备。它的主要特点是便携性和易用性&#xff0c;方便用户进行现场检测和监测。 这种检测仪通常结合了光电测量技术和现代便携式设计&#xff0c;使得用户可以在各种环境下方便地进行光透过率的测量…

OpenCV如何实现拉普拉斯算子的离散模拟

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV的Sobel 衍生品 下一篇 &#xff1a;OpenCV 如何实现边缘检测器 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 Laplacian&#xff08;&#xff09; 实…

Yolov5 v7.0目标检测——详细记录环境配置、自定义数据处理、模型训练与常用错误解决方法(数据集为河道漂浮物)

1. Yolov5 YOLOv5是是YOLO系列的一个延伸&#xff0c;其网络结构共分为&#xff1a;input、backbone、neck和head四个模块&#xff0c;yolov5对yolov4网络的四个部分都进行了修改&#xff0c;并取得了较大的提升&#xff0c;在input端使用了Mosaic数据增强、自适应锚框计算、自…

C++ 二叉搜索树

文章目录 二叉搜索树的概念二叉搜索树的性质二叉搜索树的模拟实现封装框架添加操作查找操作删除操作 二叉搜索树的概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都…

PD虚拟机和Crossover软件有什么不同?谁更强大?

PD虚拟机&#xff08;Parallels Desktop&#xff09;和Crossover软件都是为Mac用户提供在macOS上运行Windows应用程序的能力&#xff0c;但它们在设计理念、功能和使用场景上存在一些差异。 PD虚拟机&#xff08;Parallels Desktop&#xff09;的特点&#xff1a; 1. 全面的虚…

MySQL中的并发控制,读写锁,和锁的粒度

MySQL中的并发控制&#xff0c;读写锁&#xff0c;和锁的粒度 并发控制的概述 在数据库系统中&#xff0c;并发控制是一种用于确保当多个用户同时访问数据库时&#xff0c;系统能够提供数据的一致性和隔离性的机制。MySQL支持多种并发控制技术&#xff0c;其中包括锁机制、多…

用友 GRP-U8 fastjson远程代码执行漏洞复现(XVE-2024-8863)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友 GRP-U8 R10系列版本 VerifyToken 接口存在低版本fastjson反序列化漏洞,未经…

用户请求经过哪些处理(公网)

DNS服务器之间协作&#xff1a; 递归DNS查询&#xff1a;用户的请求首先发送到递归DNS服务器。 查询根DNS服务器&#xff1a;递归DNS服务器查询根DNS服务器&#xff0c;以找到管理.com顶级域的TLD DNS服务器。 查询TLD DNS服务器&#xff1a;根DNS服务器响应带有TLD DNS服务器…

centos7.6上安装mysql7.6 完整过程

安装过程&#xff1a; 参考&#xff1a;https://blog.csdn.net/qq_45103475/article/details/123151050 查找mysql [rootbogon ~]# whereis mysql mysql: /usr/lib64/mysql /usr/share/mysql 删除目录 [rootbogon ~]# rm -rf /usr/lib64/mysql [rootbogon ~]# whereis mysql m…

计算机服务器中了devicdata勒索病毒怎么处理,devicdata勒索病毒解密工具流程

随着网络技术的不断发展与应用&#xff0c;越来越多的企业离不开网络&#xff0c;通过网络可以开展各项工作业务&#xff0c;网络也为企业的生产运营提供各类极大便利&#xff0c;大大提高了生产效率&#xff0c;但网络在为企业提供便利的同时&#xff0c;也为企业的数据安全带…

AJAX——案例

1.商品分类 需求&#xff1a;尽可能同时展示所有商品分类到页面上 步骤&#xff1a; 获取所有的一级分类数据遍历id&#xff0c;创建获取二级分类请求合并所有二级分类Promise对象等待同时成功后&#xff0c;渲染页面 index.html代码 <!DOCTYPE html> <html lang&qu…

探索SAVI:土壤调整植被指数的意义与应用

​随着遥感技术的不断发展&#xff0c;植被指数成为了评估地表植被覆盖和健康状况的重要工具之一。其中&#xff0c;SAVI&#xff08;Soil Adjusted Vegetation Index&#xff0c;土壤调整植被指数&#xff09;作为一种针对土壤表面反射率进行调整的植被指数&#xff0c;在土地…

Python 基础、流程、容器、函数

一、基础语法 1.1 前言 1.1.1 Python简介 Python是一门编程语言&#xff0c;Python的作者是Guido van Rossum&#xff08;龟叔&#xff09; Python优点&#xff1a;简单易学 Python与嵌入式、集成电路行业 强大的库和工具生态系统&#xff1a;Python拥有广泛而强大的库和…

深入理解高级加密标准(Advanced Encryption Standard)

title: 深入理解高级加密标准&#xff08;Advanced Encryption Standard&#xff09; date: 2024/4/23 20:04:36 updated: 2024/4/23 20:04:36 tags: AES概述加密原理优势特点算法详解安全性应用实践案例分析 第一章&#xff1a;AES概述 AES的历史和背景 历史&#xff1a; 高…

MySQL数据库精讲001——概述

MySQL数据库精讲001——概述 文章目录 MySQL数据库精讲001——概述1.1 安装1.1.1 版本1.1.2 安装一、下载二、解压三、配置1. 添加环境变量2. 初始化MySQL3. 注册MySQL服务4. 启动MySQL服务5. 修改默认账户密码 四、登录MySQL五、卸载MySQL 1.1.3 连接1.1.4 企业使用方式(了解)…

华为数通方向HCIP-DataCom H12-821题库(多选题:321-340)

第321题 关于OSPF的命令描述,不正确的是: A、stub区域和totally stub区域配置了no-summary参数 B、OSPFv2和OSPF v3配置接口命令的区别是OSPF V2可以使用network命令,而OSPFv3直接 C、在接口上使能stubrouter命令用来配置次路由器为stub路由器,stub路由器可以与非stub路由 …

mac安装nvm管理node(手残流,git下载)

1. 准备 首先电脑里得有brew、git、vscode&#xff0c;看这里安装brew、git&#xff0c;看这里安装vscode。 我本人比较low&#xff0c;mac命令也记不熟&#xff0c;本篇就是git下载nvm&#xff0c;vscode看配置&#xff0c;省心不动脑子就可以了。 2. 清理node 如果mac里没…