c++的类型转换方法

一、静态类型转换(static_cast)

静态类型的转换主要用于基本类型之间的转换,比如int类型转换为double类型。但是static_cast也可以支持上下行的转换(存在继承关系之间的转换)

基本类型之间的转换举例

 上下行转换的举例

#include <iostream>
#include<typeinfo>
using namespace std;class A
{
public:int a=1;int b=2;int c=3;};class B:public A
{
public:int d=4;int e=5;int f=6;
};int main()
{//用指针实例化一个类对象A *ptr_a=new A();B *ptr_b=new B();cout<<"A的数据:"<<ptr_a->a<<endl<<"B的数据:"<<ptr_b->d<<endl;//A指向B,B指向AA *ptr_a1=static_cast<A *>(new B());//上行转换(子类强行转换为父类),安全B *ptr_b1=static_cast<B *>(new A());//下行转换(父类强行转换为子类),不安全,容易越界,因为父类只能访问自己的cout<<"A指针访问数据:"<<ptr_a1->c<<endl<<"B指针访问数据:"<<ptr_b1->f<<endl;return 0;
}

从输出结果看,下行转换是支持的(输出了数据),结合源代码可知,26708不是我们想要输出的数据,指针访问越界了(A是基类,只能访问自己的空间,也证明了继承关系不具有双向性,继承关系是单向的)

二、动态类型转换(dynamic_cast)

动态类型的转换主要用来转换存在继承关系的指针或引用类型,相比于静态类型转换(static_cast),动态类型转换会进行类型检查,如果转换不安全会抛出异常错误信息

#include <iostream>
#include<typeinfo>
using namespace std;class A
{
public:int a=1;int b=2;int c=3;};class B:public A
{
public:int d=4;int e=5;int f=6;
};int main()
{//用指针实例化一个类对象A *ptr_a=new A();B *ptr_b=new B();cout<<"A的数据:"<<ptr_a->a<<endl<<"B的数据:"<<ptr_b->d<<endl;//A指向B,B指向AA *ptr_a1=dynamic_cast<A *>(new B());//上行转换(子类强行转换为父类),安全B *ptr_b1=dynamic_cast<B *>(new A());//下行转换(父类强行转换为子类),不安全,容易越界,因为父类只能访问自己的cout<<"A指针访问数据:"<<ptr_a1->c<<endl<<"B指针访问数据:"<<ptr_b1->f<<endl;return 0;
}

这段代码运行之后会报异常信息

D:\study\STL\class_cast\main.cpp:31: error: cannot dynamic_cast '(operator new(12u), (<statement>, ((A*)<anonymous>)))' (of type 'class A*') to type 'class B*' (source type is not polymorphic)
     B *ptr_b1=dynamic_cast<B *>(new A());//下行转换(父类强行转换为子类),不安全,容易越界,因为父类只能访问自己的
                                        ^

说明dynamic_cast只支持上行类型转换(子类转换为父类)。

三、常量类型转换(const_cast)

常量类型转换常用来去除指针或引用的常量性。对于指针或引用,常量转换可以将其修改为非常量。例如:

tips:通过指针b可以修改第三方的值

需要注意的是如果修饰某个变量为常量,则不可更改数据,但是未修饰的变量可以更改数据

#include <iostream>
using namespace std;int main()
{int c=6;const int *a=&c;//const修饰的a为常量属性,a不可被修改int *b=const_cast<int *>(a);//类型转换后可以被修改cout<<*a<<" "<<*b<<" "<<c<<endl;*b=9;cout<<*a<<" "<<*b<<" "<<c<<endl;int num=666;const int *ptr_num=const_cast<const int *>(&num);cout<<*ptr_num<<" "<<num<<endl;num=999;cout<<*ptr_num<<" "<<num<<endl;return 0;
}

输出结果:

四、重新解释转换(reinterpret_cast)

重新解释转换用于将一个指针转换为其他类型的指针,该类型转换危险程度极高,容易造成未定义的行为。

reinterpret_cast支持基本类型指针之间的转换

 也支持上下行类型之间的转换包括不相关的类类型之间的转换

#include <iostream>
using namespace std;
class A
{
public:int a=1;int b=2;int c=3;};class B:public A
{
public:int d=4;int e=5;int f=6;
};class C
{
public:int g=7;int h=8;int i=9;
};int main()
{//用指针实例化一个类对象A *ptr_a=new A();B *ptr_b=new B();C *ptr_c=new C();cout<<"A的数据:"<<ptr_a->a<<endl<<"B的数据:"<<ptr_b->d<<endl<<"C的数据:"<<ptr_c->g<<endl;;//A指向B,B指向A,C指向A,A指向C,B指向C,C指向BA *ptr_a1=reinterpret_cast<A *>(new B());B *ptr_b1=reinterpret_cast<B *>(new A());C *ptr_c1=reinterpret_cast<C *>(new A());A *ptr_a2=reinterpret_cast<A *>(new C());B *ptr_b2=reinterpret_cast<B *>(new C());C *ptr_c2=reinterpret_cast<C *>(new B());cout<<"A指针访问数据:"<<ptr_a1->a<<" "<<ptr_a2->c<<endl<<"B指针访问数据:"<<ptr_b1->f<<" "<<ptr_b2->a<<endl<<"C指针访问的数据:"<<ptr_c1->g<<" "<<ptr_c2->i<<endl;return 0;
}

运行结果:

ps:通过运行结果可知,数据访问乱了!

其他

上下行转换关系图

(父类与子类关系可以理解为基类与派生类关系)

其余类型转换方法

类型转换方法其实远不止四个,比如自动类型转换(系统会自动转换)

规则:占用内存字节数少的类型向占用内存字节数多的类型转换(内存字节数可以用值域替代),目的保证精度不降。

编写程序证明有符号类型自动转换为无符号类型(最终输出结果为无符号类型)

 ps2:强制类型转换

(强制转换的类型)(被转换的表达式)

编写程序自证类型发生了强制转换

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

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

相关文章

金航标电子位于广西柳州鹿寨县天线生产基地于大年正月初九开工了!!!

金航标kinghelm&#xff08;www.kinghelm.com.cn&#xff09;总部位于中国深圳市&#xff0c;兼顾技术、成本、管理、效率和可持续发展。东莞塘厦实验室全电波暗室、网络分析仪、高低温测试柜等仪器设备齐全&#xff0c;可进行高低温、双85等测试&#xff0c;独立完成产品的检测…

数字化转型导师坚鹏:数据安全法解读与政府数字化转型

网络安全法、数据安全法、个人信息保护法解读与政府数字化转型 课程背景&#xff1a; 很多机构存在以下问题&#xff1a; 不清楚网络安全法、数据安全法、个人信息保护法立法背景&#xff1f; 不知道如何理解网络安全法、数据安全法、个人信息保护法政策&#xff1f; 不…

高级RAG:使用RAGAs + LlamaIndex进行RAG评估,包括原理、图和代码

原文地址&#xff1a;Using RAGAs LlamaIndex for RAG evaluation 2024 年 2 月 5 日 如果您已经为实际的业务系统开发了检索增强生成&#xff08;Retrieval Augmented Generation, RAG&#xff09;应用程序&#xff0c;那么您可能会关心它的有效性。换句话说&#xff0c;您…

Golin 弱口令/漏洞/扫描/等保/基线核查的快速安全检查小工具

下载地址&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/db6afba6de1f 主要功能 主机存活探测、漏洞扫描、子域名扫描、端口扫描、各类服务数据库爆破、poc扫描、xss扫描、webtitle探测、web指纹识别、web敏感信息泄露、web目录浏览、web文件下载、等保安全风险问题风险…

【前端素材】推荐优质后台管理系统Start Admin平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

nios ii开发随笔

错误一&#xff1a; d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_64-mingw32/bin/../lib/gcc/nios2-elf/5.3.0/../../../../../H-x86_64-mingw32/nios2-elf/bin/ld.exe: test.elf section .text will not fit in region ram_oc_xzs d:/intelfpga/17.1/nios2eds/bin/gnu/h-x86_6…

鸿蒙OS应用开发之显示图片组件6

前面学习了怎么样让图片合适的大小来显示出来,达到最佳的布局显示图片。现在来学习PixelMap图片显示。PixelMap图片是指图片解码后无压缩的位图,用于图片显示或图片处理。 由于PixelMap图片是一种无压缩的图片,比较适合图片处理,比如从网络上加载图片之后,再进行处理再显示…

STM32-启用蜂鸣器

目录 1 、电路构成及原理图 2、编写实现代码 main.c beep.c beep.h 3、代码讲解 4、 烧录到开发板调试、验证代码 5、检验效果 本人使用的是朗峰 STM32F103 系列开发板&#xff0c;此笔记基于这款开发板记录。 1 、电路构成及原理图 首先&#xff0c;通过朗峰 F1 开…

SpringBoot 3 新特性

目录 1. GraalVM2. 支持虚拟线程3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件&#xff0c;可以显著提升启动速度、峰值性能以及减少内存应用。传统的应用都是编译成字节码&#xff0c;然后通过JVM解释并最终编译成机器码来运行&a…

ELK入门(二)- springboot整合ES

springboot整合elasticsearch 引用依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

TT语音×个推:流失预测准确率超90%,撬动存量增长个推GeTui 2024-02-23 09:50 浙江

当移动互联网进入存量时代&#xff0c;如何更高效地进行用户全生命周期管理、提升用户生命周期价值&#xff0c;变得尤为重要。TT语音是国内领先的兴趣社交平台&#xff0c;累计注册用户数高达数亿。为了进一步盘活存量用户价值&#xff0c;TT语音从2019年起便与个推合作&#…

三分钟快速搭建家纺行业小程序商城:轻松实现电子商务梦想

随着互联网的普及和移动设备的广泛使用&#xff0c;越来越多的商业活动正在向数字化转型。在这个过程中&#xff0c;小程序商城作为一种新型的电子商务模式&#xff0c;正逐渐受到商家的青睐。本文将通过具体步骤&#xff0c;指导读者如何开发一个纺织辅料小程序商城。 一、选择…

EarMaster Pro 7 简体中文破解版下载 v7.2.0.42 电脑版

软件介绍 EarMaster Pro 简体中文破解版是一款由丹麦皇家音乐学院官方制作的多功能音乐品鉴教育软件&#xff0c;软件具有丰富的功能&#xff0c;它可以自定义培训课程&#xff0c;针对性地训练音准、节奏、和声等音乐要素&#xff0c;用户可以根据自身需求和水平选择不同难度…

【探索Linux】—— 强大的命令行工具 P.23(线程池 —— 简单模拟)

阅读导航 引言一、线程池简单介绍二、Linux下线程池代码⭕Makefile文件⭕ . h 头文件✅Task.hpp✅thread.hpp✅threadPool.hpp ⭕ . cpp 文件✅testMain.cpp 三、线程池的优点温馨提示 引言 在Linux下&#xff0c;线程池是一种常见的并发编程模型&#xff0c;它能够有效地管理…

一键搭建Tex书写环境【免费、开源】

安装 # 安装 vscode scoop install extras/vscode # 安装 cmder(windows下超好用的命令行工具&#xff0c;可选) scoop install main/cmder-full # 安装 miktex scoop install main/miktex配置 将我的VSCode配置文件导入到 VSCode 即可。 VSCode for Latex 配置文件 具体步…

neo4j创建新数据库

根据网上提供的教程&#xff0c;neo4j并没有提供创建数据库的命令&#xff0c;其只有一个默认数据库graph.db&#xff0c;该数据库中的所有数据将存储在neo4j安装路径下的data/databases/graph.db目录中。 因此&#xff0c;我们猜想&#xff0c;如果我们将默认数据库的名字修改…

【C++】模板初阶 | 泛型编程 | 函数模板 | 类模板

目录 1. 泛型编程 2. 函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3. 类模板 3.1 类模板的定义格式 3.2 类模板的实例化 【本节目标】 1. 泛型编程 2. 函数模板 3. 类模板 1. 泛型编程 如何实现一…

SpringCloud(16)之SpringCloud OpenFeign和Ribbon

一、Spring Cloud OpenFeign介绍 Feign [feɪn] 译文 伪装。Feign是一个轻量级的Http封装工具对象,大大简化了Http请求,它的使用方法 是定义一个接口&#xff0c;然后在上面添加注解。不需要拼接URL、参数等操作。项目主页&#xff1a;GitHub - OpenFeign/feign: Feign makes w…

java课设之简易版客房管理系统(mvc三层架构)

&#xff08;一&#xff09;、系统概述&#xff1a; 客房管理系统是一个用于管理酒店客房信息的程序&#xff0c;主要功能包括客房信息录入、客房状态查询、客房订单管理&#xff0c;客房的预定功能。 &#xff08;二&#xff09;、功能说明&#xff1a; 1.登录&#xff1a;管理…

如何在Linux部署OpenGauss数据管理系统并实现公网访问内网数据

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…