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

C++----类型转换

C++类型转换

  • C语言类型转换
  • C++类型转换
    • static_cast
    • reinterpret_cast
    • const_cast
    • dynamic_cast
    • explicit

C语言类型转换

  • 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败
int i = 1;
// 隐式类型转换 -- 相近类型/相关类型 -- 意义相似
double d = i;
printf("%d, %.2f\n", i, d);
  • 显式类型转化:需要用户自己处理
int* p = &i;
// 显示的强制类型转换 -- 不相近类型/不相关类型
int address = (int)p;
  • 整形提升
    int遇到unsigned int产生中间变量将int整形提升为unsigned int再进行比较,死循环
size_t pos;
cin >> pos; // 0
int n = 5;
while (n >= pos) // 整形提升,本质就是隐式类型转换
{
	cout << n << endl;
	--n;
}

C++类型转换

意义:

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

static_cast

相关类型的转换:static_cast对应C语言的隐式类型转换
static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换
在这里插入图片描述
看到static_cast就标识是相关类型转换
在这里插入图片描述
不相关类型不行

reinterpret_cast

不相关类型转换:reinterpret_cast
reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型
在这里插入图片描述

const_cast

const_cast最常用的用途就是删除变量的const属性,方便赋值,虽然可以直接(int)强制类型转换,但是C语言不规范*
在这里插入图片描述
但是我们看到a未被修改,这时编译器优化,改为volatile const int a = 2;直接从内存里取

在这里插入图片描述
注意:const变量可以通过取地址修改

dynamic_cast

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

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

子类指针/引用(用dynamic_cast转型是安全的)
注意

  1. dynamic_cast只能用于含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

例如:

class A
{
public:
	virtual void f() {}
private:
	int _a = 1;
};

class B : public A
{
public:
	int _b = 1;
};
  • pa如果是指向父类对象,严格来说是不能转的,因为存在风险,访问时存在越界风险
    在这里插入图片描述
  • pa如果是指向子类对象,可以转换,是安全的
    在这里插入图片描述
  • 如果使用c的强制类型转换,那么这里是不安全的,无法识别上面的两种情况,建议是使用dynamic_cast,他是安全的。如果是第2种情况可以转换成功,第1种情况转换失败,返回NULL
    成功:
    在这里插入图片描述
    失败:
    在这里插入图片描述

explicit

explicit为清晰的;明确的之意.顾名思义,关键字explicit可以阻止隐式转换的发生.
考:C++ 中explicit关键字详解

相关文章:

  • 机器学习笔记之线性分类——高斯判别分析(二)最优参数求解
  • 爬取头像的程序不好用了?那就再重新做一份咯
  • 常见的三种池化操作:MaxPool2d/AdaptiveMaxPool2d/AvgPool2d/AdaptiveAvgPool2d...(Pytorch)
  • Java 面试八股文 —— SSM 框架常见面试题
  • Tomcat的安装与优化
  • 第三章 神经网络——什么是神经网路激活函数3层神经网络的简单实现手写数字识别
  • 隧道调频广播覆盖-天线分布式部署是隧道调频广播无线覆盖系统设备介绍
  • 2022-8-31 第七小组 学习日记 (day55)JSP
  • 全球与中国吸油烟机行业市场规模调研及未来前瞻报告2022-2028年
  • 金仓数据库KingbaseES客户端应用参考手册--14. sys_receivewal
  • 软件测试自学不知道如何下手?一篇文章7个步骤带你找准方向
  • 金仓数据库KingbaseES客户端应用参考手册--15. sys_restore
  • map函数传入parseInt函数处理数字输出有误
  • C++ 小游戏 视频及资料集(9)
  • git--查看信息的命令--使用/实例
  • co.js - 让异步代码同步化
  • java8 Stream Pipelines 浅析
  • Joomla 2.x, 3.x useful code cheatsheet
  • Terraform入门 - 3. 变更基础设施
  • Vue.js源码(2):初探List Rendering
  • 番外篇1:在Windows环境下安装JDK
  • 开发基于以太坊智能合约的DApp
  • 力扣(LeetCode)965
  • 聊聊flink的BlobWriter
  • 前端存储 - localStorage
  • 微信开放平台全网发布【失败】的几点排查方法
  • 一些关于Rust在2019年的思考
  • 原生Ajax
  • nb
  • k8s使用glusterfs实现动态持久化存储
  • scrapy中间件源码分析及常用中间件大全
  • 我们雇佣了一只大猴子...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • (1)(1.13) SiK无线电高级配置(六)
  • (2)nginx 安装、启停
  • (4)Elastix图像配准:3D图像
  • (7)STL算法之交换赋值
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (附源码)计算机毕业设计大学生兼职系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (三)Honghu Cloud云架构一定时调度平台
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (小白学Java)Java简介和基本配置
  • (转)Scala的“=”符号简介
  • (转)VC++中ondraw在什么时候调用的
  • (转)创业的注意事项
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net 4.0发布后不能正常显示图片问题
  • .NET Reactor简单使用教程
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .Net的C#语言取月份数值对应的MonthName值