8,四个类型转换const_cast、reinterpret_cast、dynamic_cast、static_cast

类型转换const_cast、reinterpret_cast、dynamic_cast、static_cast

  • const_cast
  • reinterpret_cast
  • dynamic_cast
  • static_cast

const_cast

被const修饰的函数可以被访问,但是不能被修改成员变量
const_cast可以去掉const

#include <iostream>
using namespace std;class FHello
{
public:FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a = 0;b = 10;c = 20.f;
}
void FHello::Init()/*const*/
{auto Hello_a = [&](){cout << a << endl;};auto Hello_b = [&]()->bool{cout << b << endl;return true;};Hello_a();if (bool bHello = Hello_b()){cout << "true" << endl;}else{cout << "false" << endl;}
}
int main()
{const FHello* HelloTest = new FHello();//HelloTest->Init();因为HelloTest被const修饰了而上面代码中没有用const修饰//用const_cast去掉constFHello* Test = const_cast<FHello*>(HelloTest);Test->Init();//编译出错会返回NULL//c风格的强转,是万能强转//容易出问题,万一转换失败了变成野指针了也不知道,少用FHello* NewTest = (FHello*)HelloTest;NewTest->Init();delete HelloTest;return 0;
}

reinterpret_cast

把指针转换成int,也可以把int转成指针,也可以指针转换成指针

#include <iostream>
using namespace std;class FHello
{
public:FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a = 0;b = 10;c = 20.f;
}
void FHello::Init()/*const*/
{auto Hello_a = [&](){cout << a << endl;};auto Hello_b = [&]()->bool{cout << b << endl;return true;};Hello_a();if (bool bHello = Hello_b()){cout << "true" << endl;}else{cout << "false" << endl;}
}
int main()
{//const_castconst FHello* HelloTest = new FHello();FHello* Test = const_cast<FHello*>(HelloTest);Test->Init();FHello* NewTest = (FHello*)HelloTest;NewTest->Init();//reinterpret_cast//reinterpret_cast,先转换成int,再转换成指针int a = reinterpret_cast<int>(NewTest);FHello*b = reinterpret_cast<FHello*>(a);b->Init();//也可以转换成int*指针,也可以转换回来int* a2 = reinterpret_cast<int*>(NewTest);FHello* b2 = reinterpret_cast<FHello*>(a2);b2->Init();//可以转换成float*指针,但是不可以用float类型float* a3 = reinterpret_cast<float*>(NewTest);FHello* b3 = reinterpret_cast<FHello*>(a3);b3->Init();delete HelloTest;return 0;
}

dynamic_cast

动态的转化:可以向上转化也可以向下转化
向上转化和向下转化的意思是在数层的继承关系中,可以向父类或派生类进行转化
向下转换时会进行类型检测,如果类型无法转换回返回NULL。是一个比较安全的转换
接口(父类)必须有虚函数,否则会报错

#include <iostream>
using namespace std;class FHello
{
public:FHello();virtual ~FHello();void Init();/*const*/
private:int a;int b;float c;
};
FHello::FHello()
{a = 0;b = 10;c = 20.f;
}
FHello::~FHello() {}
void FHello::Init()/*const*/
{auto Hello_a = [&](){cout << a << endl;};auto Hello_b = [&]()->bool{cout << b << endl;return true;};Hello_a();if (bool bHello = Hello_b()){cout << "true" << endl;}else{cout << "false" << endl;}
}class FHello1:public FHello
{
public:void Hello1temp() {}
private:int a;
};class FHello2 :public FHello1
{};int main()
{//const_castconst FHello* HelloTest = new FHello();FHello* Test = const_cast<FHello*>(HelloTest);Test->Init();FHello* NewTest = (FHello*)HelloTest;NewTest->Init();//reinterpret_castint a = reinterpret_cast<int>(NewTest);FHello*b = reinterpret_cast<FHello*>(a);b->Init();int* a2 = reinterpret_cast<int*>(NewTest);FHello* b2 = reinterpret_cast<FHello*>(a2);b2->Init();float* a3 = reinterpret_cast<float*>(NewTest);FHello* b3 = reinterpret_cast<FHello*>(a3);b3->Init();//dynamic_castFHello* h1 = new FHello1();//这一步也是向上转换//向下转换:FHello1* A = dynamic_cast<FHello1*>(h1);A->Hello1temp();//向上转换,用的少,因为有更简单的方法,如上FHello* B = dynamic_cast<FHello*>(A);B->Init();FHello* B2 = A;//进行隐式转换FHello2* FHA2 = dynamic_cast<FHello2*>(h1);//转换失败,输出NULLif (FHA2){}delete HelloTest;delete h1;return 0;
}

static_cast

可以向上转化也可以向下转化
向下转换时不安全
static_cast不可以转换const、volitale、_unaligned

static_cast和dynamic_cast相比static_cast可以没有虚函数,而dynamic_cast必须有虚函数

格式

FHello* A=static_cast<FHello*>(B);

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

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

相关文章

SyntaxError: Cannot use import statement outside a module

node环境运行报错&#xff1a; 解决步骤&#xff1a; 1. npm init -y 2. 在 package.json 文件中加入一条&#xff1a;"type": "module", 3. 保存后再执行即可 附&#xff1a;最好是不要在node用import&#xff0c;否则需要上次配置 建议1&#xff1a;用re…

el-table实现静态和动态合并单元格 以及内容显示的问题

实现效果图 <el-tablev-loading"loading":data"tableData"style"width: 100%":row-class-name"tableRowClassName"size"small"><el-table-column fixed label"序号" width"50"><el-tab…

Detecting Twenty-thousand Classes using Image-level Supervision

Detecting Twenty-thousand Classes using Image-level Supervision 摘要背景方法PreliminariesDetic:具有图像类别的检测器loss技术细节扩展Grad-CAMGrad-CAM原理 总结 摘要 摘要 由于检测数据集的规模较小&#xff0c;目前的物体检测器在词汇量方面受到限制。而图像分类器的数…

LeetCode_03Java_1572. 矩阵对角线元素的和

给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&#xff1a;1 5 9 3 7 2…

Scratch 之 3D 介绍及教程

第一章 为什么 3D 很难&#xff1f; 1.1 3D 难在何处&#xff1f; 3D 之所以会使我们觉得困难&#xff0c;是因为 Scratch 软件只有两个坐标轴&#xff0c;既&#xff1a;X轴、Y轴。 2维坐标系 而 3D 却拥有三个坐标轴&#xff1a; 3维坐标系 怎么办&#xff1f;很简单&…

Gin各种参数接收

Gin参数接收 文章目录 Gin参数接收1.各个参数的接收方法Gin中发送JSON数据Gin接收querystring数据Gin接收Form的参数Gin接收URI参数 2.参数绑定方式接收(更加方便)推荐一款软件 1.各个参数的接收方法 声明: 这里的c都是c *gin.Context中的c Gin中发送JSON数据 在传输或接受JS…

33 | 美国总统数据分析

在这个数据分析项目中,利用Pandas等Python库对美国2020年7月22日至2020年8月20日期间的超过75万条捐赠数据进行了深入的探索和分析。通过这一分析,他们揭示了这段时间内美国选民对总统候选人的偏好和捐款情况。以下是对文章中的主要步骤和内容的进一步描述: 数据集处理: 作…

Jquery 复选框点击生成标签 源代码

html <!DOCTYPE html> <html><head><meta charset"utf-8"><title>服务资源管理</title><link rel"stylesheet" type"text/css" href"../lib/layui/css/layui.css" /><link rel"st…

2023牛客第八场补题报告A H J K

2023牛客第八场补题报告A H J K A-Alive Fossils_2023牛客暑期多校训练营8 (nowcoder.com) 思路 统计字符串&#xff0c;取出现次数为t的。 代码 #include <bits/stdc.h> #define int long long #define endl \n #define IOS ios::sync_with_stdio(0), cin.tie(0), …

【C++】面试题

1、都说c是面向对象的语言&#xff0c;面向对象的三个特性能 [展开] 介绍一下吗&#xff1f; 封装&#xff1a;封装是一种集中管理的思想&#xff0c;把内部的数据和实现方法组合在一起&#xff0c;并且不对外暴漏内部的数据和实现方法&#xff0c;只对外提供几个接口来完成函数…

DockePod信号处理机制与僵尸进程优化

Docke&Pod信号处理与僵尸进程优化 容器与信号的关系 SIGTERM信号&#xff1a;程序结束(terminate)信号&#xff0c;这是用来终止进程的标准信号&#xff0c;也是 kill 、 killall 、 pkill 命令所发送的默认信号。与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程…

k8s和docker简单介绍

当涉及到容器技术和容器编排时&#xff0c;Docker和Kubernetes是两个重要的概念。我将更详细地介绍它们以及它们之间的关系。 Docker&#xff1a; Docker是一种容器化技术&#xff0c;它允许你将应用程序及其依赖项打包到一个称为"容器"的封闭环境中。每个容器都包…

rust包跨平台编译,macbook ,linux

在 MacBook 上编译 Rust 项目并生成 Linux 包需要一些步骤。以下是一般的步骤概述&#xff1a; 1. **安装所需工具&#xff1a;** 首先&#xff0c;确保您的 MacBook 上已经安装了所需的工具。您需要 Rust 编程语言的工具链以及一些用于交叉编译到 Linux 的工具。 - 安装 R…

【BASH】回顾与知识点梳理(二十一)

【BASH】回顾与知识点梳理 二十一 二十一. Linux 的文件权限与目录配置21.1 使用者与群组属主(文件拥有者)属组(群组概念)其他人的概念root(万能的天神)Linux 用户身份与群组记录的文件 21.2 Linux 文件权限概念Linux 文件属性Linux 文件权限的重要性 21.3 如何改变文件属性与权…

组合模式(C++)

定义 将对象组合成树形结构以表示部分-整体’的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性(稳定)。 应用场景 在软件在某些情况下&#xff0c;客户代码过多地依赖于对象容器复杂的内部实现结构&#xff0c;对象容器内部实现结构(而非抽象接口)的变化…

Redis数据结构——链表list

链表是一种常用的数据结构&#xff0c;提供了顺序访问的方式&#xff0c;而且高效地增删操作。 Redis中广泛使用了链表&#xff0c;例如&#xff1a;列表的底层实现之一就是链表。 在Redis中&#xff0c;链表分为两部分&#xff1a;链表信息 链表节点。 链表节点用来表示链表…

PyTorch深度学习实践---笔记

PyTorch深度学习实践---笔记 2.线性模型&#xff08;Linear Model&#xff09;2.exercise 3. 梯度下降算法&#xff08;Gradient Descent&#xff09;3.1梯度下降&#xff08;Gradient Descent&#xff09;3.2 随机梯度下降&#xff08;Stochastic Gradient Descent&#xff09…

亚马逊测评工作室怎么做?

亚马逊是全球最大的电商平台之一&#xff0c;任何一个卖家想要提升自己店铺的知名度和销量&#xff0c;都需要关注自己Listing的Review数量和星级评价&#xff0c;而测评对于卖家账号的评定和产品曝光量有着重要影响&#xff0c;可以用于店铺提升销量&#xff0c;留评等 在进行…

【GC日志分析】-对象晋升到老年代分析

[GC (Allocation Failure) [PSYoungGen: 123456K->65432K(262144K)] 123456K->765432K(1048576K), 0.1234567 secs] [Times: user0.10 sys0.02, real0.13 secs] 从这段GC日志中&#xff0c;可以看到两个年轻代和老年代的堆内存容量变化情况。 首先&#xff0c;我们来看…

百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title></title></head><body><script>/*** * 百度坐标&#xff08;BD09&#xff09;、国测局坐标&#xff08;火星坐标&#xff0c;GCJ02&#xff09;、和…