当前位置: 首页 > news >正文

C++--类型转换

1.什么是类型转换

在传统C语言中,由强制类型转换和隐式类型转换,隐式类型转换,编译器在在编译阶段自动处理,能转换则转换,强制类型转换由用户自己转换。

缺陷:

  • 转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换
  • 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
  • 显式类型转换将所有情况混合在一起,代码不够清晰
     

比如:

    int a = 100;
    long long b = a;//隐式类型转换
    char c = b;//隐式类型转换
    size_t d = a;//隐式类型转换
    cout << a <<" " <<" " << b <<" " << c <<" " << d << endl;
    //强制类型转换
    double e = (double)a;
    float f = (double)e;
    cout << e << " " << f << endl;

在C++中,也可以使用C语言的转换方式,但在C++中,有自己的转换方式,

标准C++为了加强类型转换的可视性,引入了四种命名的强制类型转换操作符:
static_cast、reinterpret_cast、const_cast、dynamic_cast

2.不同操作符使用场景

2.1 static_cast使用

在static_cast中,它的使用方法相对于C语言中的隐式类型转换,只能转换两种类型比较接近的,不能用于不相干类型的转换。

比如:

    int a = 100;
    char b= static_cast<char>(a);
    //char* c = static_cast<char*>(a);//无法转换
    cout << b << endl;

2.2 reinterpret_cast使用

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,强制转换两种不相关的类型,即一种类型转换为另一种不相干的类型,

比如:

    int a = 100;
    char b= static_cast<char>(a);
    char* c = static_cast<char>(b);//无法转换

    char* c = reinterpret_cast<char*>(b);
    printf("%c\n", *(&c));

2.3 const_cast使用

const_cast最常用的用途就是删除变量的const属性,方便赋值,但是需要使用volatile修饰加了const的变量。

比如:

     volatile const int a = 10;
     int* p  =const_cast<int*>(&a);
     p = (int*)&a;
    *p = 20;
    cout << *p <<" " << a << endl;

2.4 dynamic_cast使用方法

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

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

向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
注意:
1. dynamic_cast只能用于父类含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
比如:

class A
{
public:
    virtual void f() {}
};

class B : public A
{};

//A*指针有可能指向父类,也有可能指向子类
void fun(A* pa)
{
    // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回

    // 如果pa是指向子类,那么可以转换,转换表达式返回正确的地址

    // 如果pa是指向父类,那么不能转换,转换表达式返回nullptr

    B* pb1 = static_cast<B*>(pa);
    B* pb2 = dynamic_cast<B*>(pa);//返回空
    cout << "pb1:" << pb1 << endl;

    cout << "pb2:" << pb2 << endl;
}
int main()
{

     //父类对象无论如何都不能转换为子类
    A a;
    B b;
    fun(&a);
    fun(&b);
    return 0;
}

 注意
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是
否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用
域,以减少发生错误的机会。强烈建议:避免使用强制类型转换。

相关文章:

C++--类型转换

1.什么是类型转换 在传统C语言中&#xff0c;由强制类型转换和隐式类型转换&#xff0c;隐式类型转换&#xff0c;编译器在在编译阶段自动处理&#xff0c;能转换则转换&#xff0c;强制类型转换由用户自己转换。 缺陷&#xff1a; 转换的可视性比较差&#xff0c;所有的转换形…...

在服务器上部署 Nginx 并设置图片服务器

问题&#xff1a;我要指定/home/images专门存放图片&#xff01;该怎么做&#xff0c;而且我的系统是centos8系统&#xff0c;只有一个root用户&#xff0c;用root用户已经安装了nginx 答案&#xff1a; 既然你使用了 CentOS 8&#xff0c;并且你想使用 /home/images 目录存放…...

使用NXP GUI GUIDER生成的GUI移植到雅特力MCU平台过程详解(ST/GD/国民/极海通用)

好记性不如烂笔头&#xff0c;既然不够聪明&#xff0c;就乖乖的做笔记&#xff0c;温故而知新。 本文档用于本人对知识点的梳理和记录 一、前言 上一篇我们有介绍NXP GUI Guider工具如何制作和调试GUI&#xff0c;GUI神器 NXP GUI GUIDER开发工具入门教程https://blog.csdn.n…...

JVM——配置常用参数,GC调优策略

文章目录 JVM 配置常用参数Java内存区域常见配置参数概览堆参数回收器参数项目中常用配置常用组合 常用 GC 调优策略GC 调优原则GC 调优目的GC 调优策略 JVM 配置常用参数 Java内存区域常见配置参数概览堆参数&#xff1b;回收器参数&#xff1b;项目中常用配置&#xff1b;常…...

使用IDEA把Java程序打包成jar

点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的号 选择JAR->From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK Artifacts添加完成后点击右下角OK 在工具栏中找到Build,选择Build Artifacts 刚才创建好的Artifacts,选择Bui…...

元宇宙和数字孪生的异同探究

元宇宙和数字孪生&#xff0c;作为两个备受瞩目的概念&#xff0c;都在不同领域引起了巨大的关注。虽然它们都涉及数字化世界的构建&#xff0c;但元宇宙和数字孪生在概念、应用和影响方面存在一些异同点。 相似之处&#xff1a; 数字表示&#xff1a; 元宇宙和数字孪生都依赖…...

初识微服务

我们在曾经最常见的就是所谓的单体架构&#xff0c;但是由于网民越来越多&#xff0c;单体架构已经逐渐的被淘汰出去&#xff0c;所以我们在单体架构的基础上提出了微服务&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0…...

数据库锁的分类 各种锁

锁的一个分类 数据库中的锁前言分享链接个人总结全局锁&#xff1a;表级锁行级锁&#xff1a; 数据库中的锁 前言 C支持并发有锁&#xff0c;Linux里面也有锁机制&#xff0c;数据库也有锁&#xff0c;什么互斥锁&#xff0c;表级锁&#xff0c;间隙锁&#xff0c;好多…&…...

MySQL数据库软件

MySQL数据库软件的详细知识介绍: 1. 存储引擎 MySQL支持多种存储引擎,如InnoDB、MyISAM等。不同引擎有各自的特点,InnoDB支持事务、行锁,MyISAM支持全文索引等。 2. 索引结构 MySQL索引主要有B树索引、哈希索引、全文索引等。这些索引通过不同的数据结构加速查找效率。 3. …...

无涯教程-PHP - preg_match_all()函数

preg_match_all() - 语法 int preg_match_all (string pattern, string string, array pattern_array [, int order]); preg_match_all()函数匹配字符串中所有出现的模式。 它将按照您使用可选输入参数order指定的顺序将这些匹配项放置在pattern_array数组中。有两种可能的类…...

Docker 练习2 安装MySQL

一、实验要求 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。具体要求如下&#xff1a; &#xff08;1&#xff09…...

AndroidStudio 编译报错Unable to make field private final

用 AndroidStudio 打开某个工程后&#xff0c;编译报错如下 Execution failed for task :app:processDebugMainManifest. > Unable to make field private final java.lang.String java.io.File.path accessible: module java.base does not "opens java.io" to …...

linux 上安装es

首先 到官网 https://www.elastic.co/cn/downloads/elasticsearch 下载对应的安装包&#xff0c;我这里下载的是 https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.9.1-linux-x86_64.tar.gz 然后讲该压缩包上传到 linux 的/usr/local 目录下执行 tar -z…...

自然语言处理从入门到应用——LangChain:索引(Indexes)-[文本分割器(Text Splitters)]

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 当我们需要处理长文本时&#xff0c;有必要将文本分割成块。虽然这听起来很简单&#xff0c;但这里存在很多潜在的复杂性。理想情况下&#xff0c;我们希望将语义相关的文本块保持在一起&#xff0c;但什么是"语义…...

Chrome如何安装插件(文件夹)

1.下载的插件 说明&#xff1a;插件文件夹 2.打开扩展程序位置 3.点击已加载的扩展程序 说明&#xff1a;找到插件的位置 4.报错 说明&#xff1a;那还要进入文件里面。 5.插件的位置 说明&#xff1a;如果已经安装了插件&#xff0c;那么需要查看插件的位置。chrome输入 …...

MySql 环境搭建

目录 MySql 在 CentOS 7 环境下安装。 说明&#xff1a; 1.卸载不要的环境 2.配置 mysql 官方 yum 源 3.开始安装 4.启动 mysql 5.mysql 登录 6.配置 mysql 7. 设置开机启动 MySql 在 CentOS 7 环境下安装。 说明&#xff1a; 在安装与卸载中&#xff0c;用户切换成 r…...

mysql 表的约束

目录 mysql 表的约束 NULL/NOT NULL DEFAULT comment zerofill PRIMARY KRY 删除主键 添加主键 复合主键 AUTO_INCREMENT UNIQUE KEY FOREIGN KEY mysql 表的约束 约束是 mysql 为了保证数据正确的一种手段&#xff0c;而前面在谈数据类型的时候&#xff0c;数据类…...

认识Redis

1. 前置操作 以下内容基于CentOS 1.1. 安装 yum -y install redis 1.2. 启动 redis-server /etc/redis.conf & 1.3. 打开 redis-cli 1.4. 停止 redis-cli shutdown 1.5. 设置远程连接 修改 /etc/redis/redis.conf 修改 bind 127.0.0.1为 bind 0.0.0.0 1.6. 使用…...

同步、异步无障碍:Python异步装饰器指南

一、引言 Python异步开发已经非常流行了&#xff0c;一些主流的组件像MySQL、Redis、RabbitMQ等都提供了异步的客户端&#xff0c;再处理耗时的时候不会堵塞住主线程&#xff0c;不但可以提高并发能力&#xff0c;也能减少多线程带来的cpu上下文切换以及内存资源消耗。但在业务…...

CodeSite for .NET Crack

CodeSite for .NET Crack CodeSite for.NET与Visual Studio集成&#xff0c;通过实时查看器日志记录系统提供对代码执行的更深入了解&#xff0c;该系统有助于在本地或远程执行代码时快速查找问题。超越传统的断点调试&#xff0c;在应用程序继续运行时记录应用程序的执行&…...

Linux链表操作全解析

Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表&#xff1f;1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...