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;独立完成产品的检测…

Linux内核中并发与竞争的处理方法:原子操作代码举例二

一. 简介 前面文章学习了Linux内核中处理并发与竞争的一种方法&#xff1a;原子操作&#xff0c;并编写代码说明原子操作中对整型变量的操作&#xff0c;文章地址如下&#xff1a; Linux内核中并发与竞争的处理方法&#xff1a;原子操作代码举例一-CSDN博客 本文学习原子操…

流畅的Python(十二)-继承的优缺点

一、核心要义 1. 子类化内置类型的缺点 2.多重继承和方法解析顺序 二、代码示例 1. 子类化内置类型的缺点 #!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2024/2/24 7:29 # Author : Maple # File : 01-子类化内置类型的问题.py # Software: PyCharm fr…

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

网络安全法、数据安全法、个人信息保护法解读与政府数字化转型 课程背景&#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文件下载、等保安全风险问题风险…

小雉系统uefi安全启动支持(微软认证)

概述 从windows8开始,微软以安全为由使用uefi替换了传统的bios引导系统,并从2021年启新生产的硬件不再支持传统bios,导致基于传统bios制作的小雉系统无法启动运行&#xff1a; uefi的安全启动原理是主板使用内置的微软公钥校验grub2等引导程序(未经过微软签名的grub2无法…

【前端素材】推荐优质后台管理系统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…

关于Spring中管理Bean的杂谈

关于Spring中管理Bean的杂谈 1 filter、监听器,不能直接被spring容器管理2 Listener监听器不能被Spring管理3 使用EasyExcel的自定义监听器,可使用Spring容器 1 filter、监听器,不能直接被spring容器管理 1 spring更多的是管理我们自己的各种组件&#xff0c;filter之类的是交…

鸿蒙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年起便与个推合作&#…

Java-8函数式编程设计-Functional-Interface

Java 8函数式编程设计-Functional-Interface 我自己的理解&#xff0c;函数式编程对用户最大的价值是促使开发者养成模块化编程的习惯&#xff0c;代码可读性和维护性提高很多。 通过阅读JDK 8的 java.util.function 和 java.util.stream 包源码&#xff0c;意在理解Java的函数…

AcWing 872:最大公约数 ← 递归及非递归解法等

【题目来源】https://www.acwing.com/problem/content/874/【题目描述】 给定 n 对正整数 ai,bi&#xff0c;请你求出每对数的最大公约数。【输入格式】 第一行包含整数 n。 接下来 n 行&#xff0c;每行包含一个整数对 ai,bi。【输出格式】 输出共 n 行&#xff0c;每行输出一…

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

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

使用c++filt 还原RTTI返回的类型名称

考虑下面的代码 const char ori[] "feelling good"; auto copy ori; std::cout << typeid(ori).name() << \n; std::cout << typeid(copy).name() << \n; 在g 编译后输出 A14_c PKc typeid操作符会返回一个const type_info&对象&a…

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

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