C++四种强制类型转换

news2024/11/29 10:41:56

四种强制类型转换

    • 🏞️1. C语言中的类型转换
    • 🍁2. 为什么C++需要四种类型转换
    • 🌠3. C++强制类型转换
      • 📖3.1 static_cast
      • 📖3.2 reinterpret_cast
      • 📖3.3 const_cast
      • 📖3.4 dynamic_cast
    • 🌁4. RTTI

🏞️1. C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转换,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换.

  1. 隐式类型转换:编译器在编译阶段自动进行,能转就转,不能转就编译失败.
  2. 显式类型转换:需要用户自己处理
int main()
{
	int i = 1;
	//隐式类型转换
	double d = i;
	printf("%d, %.2f\n", i, d);

	int* p = &i;
	//显式的强制类型转换
	int address = (int)p;
	printf("%p, %d\n", p, address);

	return 0;
}

缺陷:转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换.

🍁2. 为什么C++需要四种类型转换

C风格的转换格式很简单,但是有不少缺点:

  1. 隐式类型转换有些情况下可能会出问题:比如数据精度丢失.
  2. 显式类型转换将所有情况混合在一起,代码不够清晰.

因此C++ 提出了自己的类型转换风格,因为C++要兼容C语言,所以C++中依然可以使用C语言的转化风格.

🌠3. C++强制类型转换

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

static_cast  reinterpret_cast  const_cast  dynamic_cast

📖3.1 static_cast

static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可以用static_cast,但它不能用于两个不相关的类型进行转换.

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);
	cout << a << endl;
    
    //不支持->这是不相近的类型
    int* p = &a;
    int x = static_cast<int>(p); 

	return 0;
}

这段代码中,d变量和a变量都表示数值类型,可以使用static_cast进行强制类型转换. 而变量x和变量p,一个为数值类型,一个为指针类型,不相近,不能用static_cast进行强转.

📖3.2 reinterpret_cast

reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型.

int main()
{
    int a = 10;
	int* p = &a;
	int x = reinterpret_cast<int>(p);

	return 0;
}

📖3.3 const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值.

int main()
{
	const int a = 2;
	int* pa = const_cast<int*>(&a);
	*pa = 10;

	return 0;
}

📖3.4 dynamic_cast

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

image-20221213123634917

注意:

  1. dynamic_cast只能用于父类含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能转换则转换,不能则返回0
class A
{
public:
	virtual void f()
	{}
};

class B : public A
{};

void func(A* p)
{
	B* ptr = dynamic_cast<B*>(p);

	if (ptr)
	{
		cout << "转换成功" << endl;
	}
	else
	{
		cout << "转换失败" << endl;
	}
}

int main()
{
	A a;
	B b;

	//指向父类对象 -> 不安全
	func(&a);
	//指向子类对象 -> 安全
	func(&b);

	return 0;
}

🌁4. RTTI

RTTI:Run-time Type identification的简称,即:运行时类型识别

C++ 通过以下方式来支持RTTI

1. typeid运算符
2. dynamic_cast运算符
3. decltype

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

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

相关文章

JAVA毕业设计——基于Springboot+vue的疫情物资管理系统(源代码+数据库)

github代码地址 https://github.com/ynwynw/yiqingMaterial-public 毕业设计所有选题地址 https://github.com/ynwynw/allProject 基于Springbootvue的疫情物资管理系统(源代码数据库)047 一、系统介绍 本项目分为管理员与普通用户两种角色 管理员角色包含以下功能&#xf…

安全智能分析 技术背景

安全数据资产 统一管理DataOps&#xff0c;即 Data 和 Operations 的集成&#xff0c;于 2014 年首次提出。Gartner 将 DataOps 定义为“一种协作性的数据管理 实践&#xff0c;专注于改进组织内数据管道的通信、集成和自动化”[7]。DataOps 是一种面向流程的自动化方法&#x…

Linux安装多版本jdk(jdk8和jdk11)并可随意选择版本

一、官网下载不同版本的压缩包 官网下载地址 我这里下载的是jdk8和jdk11 二、将压缩包上传至服务器自定义的文件夹中 三、安装jdk8 1、解压压缩包 tar zxvf /install/java/jdk-8u202-linux-x64.tar.gz2、修改配置 vi /etc/profile在配置文件中添加以下配置(需修改成自己的…

购物车系统设计

1 主要功能 在用户选购商品时&#xff0c;下单前&#xff0c;暂存用户想购买的商品。 购物车对数据可靠性要求不高&#xff0c;性能也无特别要求&#xff0c;在整个电商系统是相对容易设计和实现的一个子系统。 购物车系统的主要功能&#xff1a; 把商品加入购物车&#xf…

3个月前被裁员了,心情跌落谷底,直到学姐给了我这份面试文档…

3个月前的某一天&#xff0c;正在愉快的打工&#xff0c;突然被喊去谈话&#xff0c;然后就被辞退了。。 加入了找工作的大军 然而&#xff0c;因为疫情&#xff0c;因为大专学历的我&#xff0c;找工作比以往都艰难了许多 很多&#xff0c;纯粹就是因为学历&#xff0c;都不…

如何在SpringBoot中异步请求和异步调用

一、SpringBoot中异步请求的使用 1、异步请求与同步请求 特点&#xff1a; 可以先释放容器分配给请求的线程与相关资源&#xff0c;减轻系统负担&#xff0c;释放了容器所分配线程的请求&#xff0c;其响应将被延后&#xff0c;可以在耗时处理完成&#xff08;例如长时间的运…

Python运维之远程登录paramiko(VsCode)

Python运维之远程登录----paramiko paramiko是一个用于做远程控制的模块&#xff0c;使用该模块可以对远程服务器进行命令或文件操作,paramiko是用python语言写的一个模块&#xff0c;遵循SSH2协议&#xff0c;支持以加密和认证的方式&#xff0c;进行远程服务器的连接。 par…

CentOS7中搭建docker

一、配置要求 系统&#xff1a;Centos7 Linux 内核&#xff1a;官方建议 3.10 以上 1.查看当前的内核版本 uname -r 2.卸载旧版本&#xff08;如果之前安装过的话&#xff09; yum remove docker docker-common docker-selinux docker-engine 二、安装Docker 1.安装依赖包 …

【C进阶】第十篇——数据在内存中的存储

数据类型的介绍 类型的基本归类 整型在内存中的存储 原码,反码,补码 大小端介绍 什么是大小端 为什么有大端和小端? 判断当前机器的字节序 浮点型在内存中的存储 例题引入 浮点数的存 浮点数的取 浮点数的比较 数据类型的介绍 char //字符数据类型 short…

现代制造技术产品设计与柔性制造系统的预测和分析

产品设计要求的市场竞争是面向市场&#xff0c;以用户为中心。精益设计的工业设计方法&#xff0c;以及一系列新的设计概念&#xff0c;如制造、装配过程、检查和测量、环境中的绿色设计等&#xff0c;使设计与柔性制造系统的整个过程紧密结合&#xff0c;包括从产品概念设计到…

Flask全栈开发教程

Flask全栈开发教程 成为使用 Flask、Python、HTML、CSS 和 MongoDB 的全栈 Web 开发人员&#xff01; 课程英文名&#xff1a;Web Developer Bootcamp with Flask and Python 此视频教程共5.0小时&#xff0c;中英双语字幕&#xff0c;画质清晰无水印&#xff0c;源码附件全…

[前端]白屏性能优化

[前端]白屏性能优化 业务面会问的东西 从打开一个页面&#xff0c;到页面的画面展示经历了怎样的过程&#xff1f; 简单来说&#xff0c;有以下几个主要步骤。 1、URL解析&#xff1a;判断浏览器输入的是搜索内容还是URL&#xff1b; 2、查找缓存&#xff1a;如果能找到缓存…

笔试强训(四十四)

目录一、选择题二、编程题2.1 驼峰命名法2.1.1 题目2.1.2 题解2.2 单词倒排2.2.2 题解一、选择题 &#xff08;1&#xff09;IPv4版本的因特网总共有多少有效A类地址网络&#xff08;D&#xff09; A.255 B.128 C.256 D.126 A类地址的网络号从0~127共128个&#xff0c;其中有两…

大数据 常用命令

常用shell命令 管道命令 查看/etc目录信息前5行信息 执行命令&#xff1a;ll /etc | head -5 查看/etc/profile文件后5行信息 执行命令&#xff1a;cat /etc/profile | tail -5 grep命令 抓取/etc目录下的python信息 执行命令&#xff1a;ll /etc | grep python 抓…

解决visual studio对不安全函数的警告

解决visual studio 对scanf &#xff0c;strcpy&#xff0c;strcmp等函数的不安全警告报错 可以看到&#xff0c;编译器对scanf进行了报错&#xff0c;原因是说它不安全 编译器自己给了一种解决方案&#xff1a; 使用vs自带的 scanf_s&#xff0c;但是用这个函数&#xff0c;仅…

留学Assignment写作格式简单讲解

对于Assignment写作&#xff0c;不知道大家认为它最基础的东西是什么呢&#xff1f;可能大家的答案都会是格式&#xff0c;毕竟Assignment写作&#xff0c;最需要保证的就是格式无误&#xff0c;特别是文献综述的格式&#xff0c;错了的话后果是非常严重的&#xff0c;下面就给…

Springboot 那年我双手插兜,手写一个excel导出

前言 其实就是利用了csv 和txt 文件转换 。 不多说&#xff0c;开始玩代码。 正文 本篇内容&#xff1a; ① 了解根本生成excel内容的CSV文件玩法 ② 手动拼接文本演示 ③ 项目内实战写法&#xff0c;从数据库到导出 ④ 解决list数据过多&#xff0c;使用分批分页处理生成c…

极智AI | centos7源码编译tensorflow

欢迎关注我的公众号 [极智视界]&#xff0c;获取我的更多笔记分享 大家好&#xff0c;我是极智视界&#xff0c;本文介绍一下 centos7 源码编译 tensorflow 的方法。 之前这篇《极智开发 | centos7源码编译bazel》已经为这篇 tensorflow 的源码编译铺平了道路&#xff0c;所以…

[附源码]Nodejs计算机毕业设计基于web的小说浏览系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

【Docker】Docker安装MySQL,并解决中文乱码和配置数据备份同步到宿主机

专栏精选文章 《Docker是什么&#xff1f;Docker从介绍到Linux安装图文详细教程》《30条Docker常用命令图文举例总结》《Docker如何构建自己的镜像&#xff1f;从镜像构建到推送远程镜像仓库图文教程》《Docker多个容器和宿主机之间如何进行数据同步和数据共享&#xff1f;容器…