【C++进阶】类型转换

news2024/9/29 19:07:05

🎇C++学习历程:入门


  • 博客主页:一起去看日落吗
  • 持续分享博主的C++学习历程
  • 博主的能力有限,出现错误希望大家不吝赐教
  • 分享给大家一句我很喜欢的话: 也许你现在做的事情,暂时看不到成果,但不要忘记,树🌿成长之前也要扎根,也要在漫长的时光🌞中沉淀养分。静下来想一想,哪有这么多的天赋异禀,那些让你羡慕的优秀的人也都曾默默地翻山越岭🐾。

在这里插入图片描述

💐🌷


目录

  • 💐 1. C语言中的类型转换
  • 💐2. 为什么C++需要四种类型转换
  • 💐3. C++强制类型转换
    • 🌷3.1 static_cast
    • 🌷3.2 reinterpret_cast
    • 🌷3.3 const_cast
    • 🌷3.4 dynamic_cast
    • 🌷3.5 explicit
  • 💐4. RTTI(了解)

💐 1. C语言中的类型转换

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

  1. 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
  2. 显式类型转化:需要用户自己处理
void Test ()
{
	 int i = 1;
	 // 隐式类型转换
	 double d = i;
	 printf("%d, %.2f\n" , i, d);
	 
	 int* p = &i;
	 // 显示的强制类型转换
	 int address = (int) p;
	 
	 printf("%x, %d\n" , p, address);
}

缺陷:

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


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

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

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

因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。


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

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

  • 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;
	 return 0; 
 }


🌷3.2 reinterpret_cast

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

typedef void (* FUNC)();
int DoSomething (int i)
 {
	 cout<<"DoSomething" <<endl;
	 return 0;
 }
 
void Test ()
 {
	 //
	 // reinterpret_cast可以编译器以FUNC的定义方式去看待DoSomething函数
	 // 所以非常的BUG,下面转换函数指针的代码是不可移植的,所以不建议这样用
	 // C++不保证所有的函数指针都被一样的使用,所以这样用有时会产生不确定的结果
	 //
	 FUNC f = reinterpret_cast< FUNC>(DoSomething );
	 f();
 }


🌷3.3 const_cast

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

void Test ()
 {
	 const int a = 2;
	 int* p = const_cast< int*>(&a );
	 *p = 3;
	 cout<<a <<endl;
 }


🌷3.4 dynamic_cast

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

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

注意:

  1. dynamic_cast只能用于含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0
class A
 {
public :
	 virtual void f(){}
 };
class B : public A
 {};
void fun (A* pa)
 {
	 // dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回
	 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;
 }

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

强烈建议:避免使用强制类型转换


🌷3.5 explicit

explicit关键字阻止经过转换构造函数进行的隐式转换的发生

class A
 {
public :
	 explicit A (int a)
	 {
		 cout<<"A(int a)" <<endl;
	 }
	 A(const A& a)
	 {
		 cout<<"A(const A& a)" <<endl;
	 }
private :
	 int _a ;
 };
int main ()
 {
	 A a1 (1);
	 
	 // 隐式转换-> A tmp(1); A a2(tmp);
	 A a2 = 1;
 }

此处编译不成功,explicit阻止了隐式转化的发生


💐4. RTTI(了解)

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

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

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

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

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

相关文章

蓝桥杯Python练习题8-查找整数

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给出一个包含n个整数的数列&#xff0c;问整数a在数列中的第一次出现是第几个。 输入格式   第一行包含一个整数n。  …

欢迎谷歌回归中国,但有前提!李彦宏也发了条朋友圈

2018年&#xff0c;Google部分功能成功回归中国大陆 周一&#xff0c;人民日报在海外社交媒体平台Twitter和Facebook上刊文&#xff0c;针对谷歌计划以过滤版搜索引擎重返中国大陆的消息回应称&#xff0c;欢迎谷歌重返中国大陆&#xff0c;但前提是必须遵守中国法律。李彦宏在…

云计算IaaS、PaaS(iPaaS/aPaaS)以及SaaS以及发展趋势

一、云计算IaaS、PaaS以及SaaS架构 云计算涉及了很多产品与技术&#xff0c;表面上看起来的确有点纷繁复杂&#xff0c;但是云计算本身还是有迹可循和有理可依的&#xff0c;下面介绍一套云计算的架构&#xff0c;具体请看图&#xff1a; 上面这个云架构共分为服务和管理这两…

车载入侵检测与防御系统介绍

作者 | 田铮 上海控安可信软件创新研究院项目经理 来源 | 鉴源实验室 引言&#xff1a;上一篇文章&#xff08;智能网联汽车网络安全攻击与防御技术概述&#xff09;介绍了智能网联汽车中的网络安全攻击案例和具体攻击类型。而本篇文章中&#xff0c;我们将对汽车网络安全风险…

SpringSecurity——OAuth2框架鉴权实现源码分析

SpringSecurity——OAuth2框架鉴权实现源码分析一、ManagedFilter迭代过滤器链1.4 springSecurityFilterChain1.4.7 OAuth2AuthenticationProcessingFilter①.OAuth2AuthenticationProcessingFilter.class②.CookieTokenExtractor.class&#xff08;我们自己重写的方法&#xf…

瞄准智慧园区 东方恩拓与用友协同开拓新商机

在数字化转型升级浪潮中&#xff0c;传统园区也在寻求新的发展方向&#xff0c;从传统园区向智慧园区甚至未来园区不断演进。随着国家“数字中国”、“中国智造”、“新基建”等战略的部署&#xff0c;智慧园区也迎来了新的发展机遇&#xff0c;园区的数字化、网络化、智能化是…

户外运动耳机选择哪个、最适合户外运动的蓝牙耳机推荐

还有哪个季节比秋天更适合爬山和徒步等户外运动的吗&#xff1f;秋天—没有夏日的骄阳&#xff0c;没有冬天的万物凋零&#xff0c;放眼望去都是墨绿和金黄&#xff0c;上山的话还可以采摘成熟的各种各样的果子…但是一个人的话难免有些落寞&#xff0c;要是有音乐的陪伴则会增…

公网远程连接windows SQL Server数据库【内网穿透】

文章目录1. 本地安装配置SQL Server2. 将本地sqlserver服务暴露至公网2.1 本地安装cpolar内网穿透2.2 创建隧道3. 公网远程连接sqlserver3.1 使用命令行远程连接sqlserver3.2 使用navicat premium图形界面远程连接sqlserver3.3 使用SSMS图形界面远程连接sqlserver疫情当下,居家…

win7电脑怎么录屏?超级简单的2种电脑录屏方法

相信还有不少朋友的电脑系统是win7系统。其实&#xff0c;win7电脑和win10电脑一样都有自带录屏功能。那win7电脑怎么录屏&#xff1f;在win7电脑上开启运行窗口即可&#xff0c;当然也可以通过使用专业的录屏软件来录制屏幕。 下面就由小编给大家介绍一下2个win7电脑录屏的方…

P8 PyTorch WhereGather

前言 这两个函数优点是通过GPU 运算速度快 目录&#xff1a; 1 where 2 Gather 一 where 原理&#xff1a; torch.where(condition,x,y) 输入参数&#xff1a; condition: 判断条件 x,y: Tensor 返回值&#xff1a; 符合条件时: 取x, 不满足取y 优点&#xff1a; 可以使…

关注re:Invent中国巡展,尽享数字时代红利

编辑&#xff5c;阿冒收获固然很甜蜜&#xff0c;但是收获也很辛苦。肯定会有人感觉莫名其妙&#xff0c;既然是收获&#xff0c;必然是甜蜜的&#xff0c;哪来的辛苦啊&#xff1f;且不要着急&#xff0c;容我慢慢分说。一年一度的亚马逊云科技re:Invent全球大会&#xff0c;向…

【操作系统】磁盘调度算法

文章目录影响其访问的时间因素磁盘调度&#xff08;移臂调度&#xff09;常见的磁盘调度算法1、先来先服务算法&#xff08;FCFS&#xff09;2、最短寻道时间优先算法&#xff08;SSTF&#xff09;3、电梯调度算法&#xff08;扫描算法SCAN&#xff09;4、循环扫描算法&#xf…

Microsoft Office 2016 VOL版下载

链接都是VOL版&#xff0c;和零售版功能是一样的&#xff0c;只是激活方便一些&#xff0c;三个下载链接&#xff0c;第一个是Office就是包含了Word、Excel、PPT那些的&#xff0c;另外两个一个是Visio&#xff0c;一个是Project&#xff0c;如果不需要的话&#xff0c;只下载第…

【HTML5】复习(二)

HTML5复习二1.代码一2.代码二3.CSS的引入方式4.选择器5.form表单的一些属性6.内联7. 音频视频8. 滑块、搜索、数字、URL9. 表单补充1.代码一 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head>&…

声明式事务的属性之隔离级别

声明式事务的属性之隔离级别 ①介绍 数据库系统必须具有隔离并发运行各个事务的能力&#xff0c;使它们不会相互影响&#xff0c;避免各种并发问题。一个事务与其他事务隔离的程度称为隔离级别。SQL标准中规定了多种事务隔离级别&#xff0c;不同隔离级别对应不同的干扰程度&…

智能家居创意DIY之智能灯泡

一、什么是智能灯 传统的灯泡是通过手动打开和关闭开关来工作。有时&#xff0c;它们可以通过声控、触控、红外等方式进行控制&#xff0c;或者带有调光开关&#xff0c;让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块&#xff0c;可与手机、家庭智能助手、或其他智能…

12.29日报

今天完成了数据库TestMrl的增删改查四个接口的开发&#xff0c;测试。 测试接口getQRcodeandscene 遇到的问题及解决 不知道在mapper中的增删改方法返回值int的值&#xff0c;和含义&#xff0c;在调用方法时也没有定义int来接参&#xff0c;都是直接调用。于是我定义int i&…

富丽宝石在港交所招股书再次“失效”,于海洋为控股股东

12月30日&#xff0c;贝多财经从港交所披露易了解到&#xff0c;富丽宝石国际控股有限公司&#xff08;下称“富丽宝石”&#xff09;在港交所的上市申请已经“失效”&#xff0c;目前已无法正常查看或下载。在此之前&#xff0c;富丽宝石先后于2021年6月28日、2022年6月29日在…

ERROR: PostCSS received undefined instead of CSS string

ERROR: PostCSS received undefined instead of CSS string 开发项目a的时候用的node版本比较低&#xff0c;拿到b项目的时候提示版本过低&#xff0c;要升级下node&#xff0c;本来想跟新下node的&#xff0c;后面发现nvm&#xff0c;node版本控制器&#xff0c;简单说就是下载…

Python Django入门

一、路由系统 1、Mac命令行安装django 环境 pip install django3.2 2、创建django项目 选择django项目 不同的py文件功能了解 urls.py views.py 可以使用django命令创建项目 1、Mac命令行安装django 环境 pip install django3.2 2、创建django项目 选择django项目 不通py…