C++——类型转换

目录

C语言中的类型转换

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

1、static_cast

 2、reinterpret_cast

 3、const_cast

4、dynamic_cast

关于const的典型例题

分析下列结果的原因

原因 


C语言中的类型转换


//类型转换

int main()
{
	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);
	return 0;

}

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

C风格的转换格式很简单,但是有不少缺点的:
1. 隐式类型转化有些情况下可能会出问题:比如数据精度丢失
2. 显式类型转换将所有情况混合在一起,代码不够清晰
因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。

1、static_cast

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


	int i = 1;
	// C++规范转换 -- static_cast适用相似类型的转换(这些类型的表示意义差不多)
	double d = static_cast<double>(i);
	printf("%d, %.2f\n", i, d);

 2、reinterpret_cast

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

    int* p = &i;
	// C++规范转换 --reinterpret_cast适用于不相关的类型之间的转换
	int address = reinterpret_cast<int>(p);
	printf("%x, %d\n", p, address);

 
3、const_cast

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

    //C++规范转换 -- const_cast 去掉cosnt属性。单独分出来,警示你这个很危险,用的时候谨慎一点
	volatile const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	cout << a << endl;
	cout << *p << endl;

4、dynamic_cast

dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)
向上转型:子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)
向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)
注意:
1. dynamic_cast只能用于父类含有虚函数的类
2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

1、ptr如果是指向子类对象,那么转回子类类型是没问题的。
2、ptr如果是指向父类对象,那么转回子类类型是存在越界风险的。

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

	int _a = 0;
};

class B :public A
{
public:
	int _b = 0;
};

void Func(A* ptr)
{
	// 直接父转子转换是不安全的

	// 如果ptr是指向父类,则转换失败,返回空
	// 如果ptr是指向子类,则转换成功
	B* bptr = dynamic_cast<B*>(ptr);
	cout << bptr << endl;

	if (bptr)
	{
		bptr->_a++;
		bptr->_b++;

		cout << bptr->_a << endl;
		cout << bptr->_b << endl;
	}
	
}

int main()
{
	A aa;
	B bb;
	Func(&aa);
	Func(&bb);
	return 0;
}

关于const的典型例题

分析下列结果的原因

原因 

        在代码里面,编译器会对const类型的变量进行优化,它默认为const类型的变量不会被改变。它访问这个变量的时候就会把这个变量放到寄存器里面去,用它的时候直接去寄存器里面取而不是去内存中取。
然而通过p对a进行修改的时候修改的是内存中的值。

并且我们的cout流插入是一个函数调用,它使用变量的时候去寄存器里面去取而不是去内存中。但是内存中的值已经被修改了,但是寄存器中的值还是原来的值,因此打印的还是原来的值。

        vs是去内存中取,所以监视窗口中的内容是内存中的。


        但是我们也可以防止这种优化,可以加volatile关键字,这样的话每次cout也是去内存中取,就不会优化到寄存器里面了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker是什么、有什么用的介绍

文章目录 1.背景2. Docker 是什么&#xff1f;3.Docker 容器与虚拟机的区别4.Docker 的 6 大优势1、更高效地利用系统资源2、更快的启动时间3、一致的运行环境4、持续交付和部署5、更轻松迁移6、更轻松的维护和拓展 小结 知识搬运工&#xff1a; 原文出自&#xff1a; 原文链接…

一键生成代码

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

C++/C按照时间命名保存bin文件

背景 在Linux应用编程过程中&#xff0c;使用C或者C语言保存、读取bin文件是比较常见的需求。这里详细记录一下使用C保存bin文件&#xff0c;也可以使用C语言实现。 代码 C/C语言保存bin文件函数&#xff0c;C中也能使用 正确写入返回0&#xff0c;错误返回-1 // C 保存bi…

ASP.NET Core Web API入门:创建新项目

ASP.NET Core Web API入门&#xff1a;创建新项目 一、引言二、创建新项目三、加入Startup类&#xff0c;并替换Program.cs内容四、编辑Program.cs代码五、修改控制器的路由六、运行项目 一、引言 最近闲着&#xff0c;想着没真正从0-1开发过ASP.NET Core Web API的项目&#…

找不到xinput1_3.dll怎么办?xinput1_3.dll丢失的四个修复方法

在我们打开游戏的或者软件的时候&#xff0c;电脑提示“找不到xinput1_3.dll&#xff0c;无法继续执行此代码”怎么办&#xff1f;相信困扰着不少小伙伴&#xff0c;我再在打开吃鸡的时候&#xff0c;然后花了一上午的时候时间研究&#xff0c;现在终于知道xinput1_3.dll文件是…

中国电子学会2023年05月份青少年软件编程Scratch图形化等级考试试卷三级真题(含答案)

2023-05 Scratch三级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 关于变量&#xff0c;下列描述错误的是&#xff1f;&#xff08;A &#xff09;&#xff08;2分&#xff09; A.只能建一个变量 …

Visual Studio 2022 v17.6 正式发布

Visual Studio 17.6 正式发布&#xff0c;这个最新版本提供了一系列强大的工具和功能&#xff0c;旨在使你能够制作出最先进的应用程序。 提高生产力 通过 Visual Studio 2022&#xff0c;目标是帮助你在更短的时间内完成 IDE 内的所有开发任务&#xff0c;在这个版本中&…

OpenPCDet安装、使用方式及自定义数据集训练

OpenPCDet安装、使用方式及自定义数据集训练 个人博客 OpenPCDet安装 # 先根据自己的cuda版本&#xff0c;安装对应的spconv pip install spconv-cu113# 下载OpenPCDet并安装 git clone https://github.com/open-mmlab/OpenPCDet.git cd OpenPCDet pip install -r requireme…

Linux 负载均衡集群 LVS_NAT模式 LVS_DR模式

集群 由多台主机组成&#xff0c;只做一件事&#xff0c;对外表现为一个整体。 只干一件事 &#xff1a;集群 干不同的事&#xff1a;分布式 企业集群分类 负载均衡群集&#xff08;load balance cluster&#xff09; 提高系统响应效率&#xff0c;处理更多的访问请…

深度学习的低秩优化:在紧凑架构和快速训练之间取得平衡(上)

论文出处&#xff1a;[2303.13635] Low Rank Optimization for Efficient Deep Learning: Making A Balance between Compact Architecture and Fast Training (arxiv.org) 由于篇幅有限&#xff0c;本篇博客仅引出问题的背景、各种张量分解方法及其分解FC/Conv层的方法&#x…

车牌识别之UI(Tkinter + OpenCV显示Picture和Video)

画一张总图&#xff1a; 图形界面开发 本篇只介绍图形界面开发。 遇到的第一个问题就是选择什么开发语言和技术。因为我之前用Python做过Tkinter的小东西&#xff0c;所以这次还是用Python Tkinter OpenCV来搞吧。 这里面需要注意几个地方&#xff1a; 1. Tkinter 的布局 …

冒泡排序、插入排序、希尔排序、选择排序

一、排序协议的定义 在博客的开头的&#xff0c;我们先给出排序协议的定义。因为我们本篇博客含有多种排序方式&#xff0c;为了使每种排序方法对外调用方式一致&#xff0c;我们需要定义一个排序的相关协议。所有排序的相关类都必须遵循该协议&#xff0c;让此协议来定义具体…

快速实现一个分布式定时器

定时器&#xff08;Timer&#xff09;是一种在业务开发中常用的组件&#xff0c;主要用在执行延时通知任务上。本文以笔者在工作中的实践作为基础&#xff0c;介绍如何使用平时部门最常用的组件快速实现一个业务常用的分布式定时器服务。同时介绍了过程中遇到问题的一些解决方案…

Android AIDL的使用(配源码)

零、完整源代码 链接: https://github.com/jx0260/TestGradle 一、创建AIDL文件 // IShopAidlInterface.aidl package com.example.testgradle;// Declare any non-default types here with import statementsinterface IShopAidlInterface {String getProductInfo(int prod…

【2023最新教程】一文3000字从0到1教你做app自动化测试(保姆级教程)

一、什么是App自动化&#xff1f;为什么要做App自动化&#xff1f; App自动化是指给 Android或iOS上的软件应用程序做的自动化测试。手工测试和自动化测试的对比如下&#xff1a; 手工测试优势&#xff1a;不可替代、发现更多bug、包含了人的想象力与理解力。 注意&#xff0c…

迅为iTOP-RK3588开发板Android12源码定制开发kernel开发

内核版本是 5.10.66 版本&#xff0c;内核默认的配置文件是 3588-android12/kernel-5.10/arch/arm64/configs/rockchip_defconfig 如果我们要使用图形化界面配置内核&#xff0c;操作方法如下所示&#xff1a; 方法一&#xff1a; 1 首先将默认的配置文件 rockchip_defconf…

博客系统测试用例设计之自动化测试

测试用例设计之自动化测试 &#x1f337; 一 测试用例设计&#x1f33a; 1 功能测试&#x1f338; &#xff08;1&#xff09;登录功能&#x1f338; &#xff08;2&#xff09;列表页功能&#x1f338; &#xff08;3&#xff09;编辑博客功能&#x1f338; &#xff08;4&…

DC LAB8SDC约束四种时序路径分析

DC LAB 1.启动DC2.读入设计3. 查看所有违例的约束报告3.1 report_constraint -all_violators (alias rc)3.2 view report_constraint -all_violators -verbose -significant_digits 4 (打印详细报告) 4.查看时序报告 report_timing -significant_digits 45. 约束组合逻辑(adr_i…

17 条件随机场

文章目录 17 条件随机场——CRF&#xff08;Condition Random Field&#xff09;17.1 背景介绍17.2 HMM与MEMM的区别17.3 MEMM与CRF的区别17.4 CRF模型17.4.1 CRF的概率密度函数17.4.2 CRF概率密度函数简化&#xff08;向量形式&#xff09; 17.5 CRF需要解决的问题17.6 边缘概…

测试者必知—如何做Web测试?常见测试点总结

目录 前言&#xff1a; 一、Web应用程序 二、功能测试 三、易用性测试&#xff08;界面测试&#xff09; 四、兼容性测试 五、安全性测试 六、性能测试 前言&#xff1a; Web测试是指对基于Web技术的应用程序进行测试&#xff0c;以测试其功能、性能、安全和稳定性等方面的表…