C++强制类型转换

C和C++的强制类型转换 C++ 四种强制类型转换 一般来说,我们需要类型转换的场景可以分为如下几种: 整型和浮点型以及不同长度的数据相互转换 一般规则是:占用内存低的向占用内存高的自动转换,而反向则会有转换截断的问题 整型和指针相互转换 当我们试图根据某个成员变量的偏移位计算其在该对象内存空间位置时,就会需要将指针转换为整型进行计算。当计算出该变量的位置后(整型),就需要将其转换为指针类型。 整型和枚举类型相互转换。 这种转换往往发生在数学计算的场景下。因为枚举一般只是用于表意,而实际参与运算的还是整型数据。 指针 阅读详情

C语言的强制类型转换----可读性差,十分坑人

先看个笔试选择常考题,看下面代码,写出运行结果:

#include<iostream>
using namespace std;
int main()
{
	const int a = 10;
	int*p =(int*) &a;
	*p = 20;
	cout << a << endl;
	return 0;
}

在这里插入图片描述
输出结果是仍然是10,但是内存中已经是修改后的20。What fuck?事实胜于雄辩,我们知道在C++中被const修饰的变量就是常量,所以,这里显示使用了C语言的强制类型转换,达成了修改意愿。

C语言的中强制类型转换分为隐式类型转换和显示的强制类型转换。

直接看栗子

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	double b = 20;
	b = a;
	cout << a << endl << b << endl;
	system("pause");
	return 0;
}

在这里插入图片描述
int类型的a赋值给double类型的b,是允许的,语法上认为,它们都是相近类型,都是表示数值,所以允许它们直接隐式类型转换。

如果你想把不相近类型强制转换,也许显示调用强制类型转换会有效果。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int a = 10;
	int*p = &a;

	int b = (int)p;//把指针类型转换成整形
	system("pause");
	return 0;
}

简单了解了C语言的类型转换,我们再来看看这个题。既然强制类型转换了,为什么输出结果还是10呢?因为const,C++中,编译器认为const修饰的值是常量,所以它会将这个常量放在寄存器中,当需要使用时候,它就从寄存器直接取出来这个初始化时候的常量。
在这里插入图片描述
还真是这样,为了让这货好好干活,别再偷懒优化。我们可以在a变量前加volatile,让它每次用a的值都去内存中取,保证a值得内存可见性。
在这里插入图片描述

const_cast----删除const属性的转换

const_cast最常用的用途就是删除变量的const属性,简单明了,不用考虑太多。
在这里插入图片描述

dynamic_cast----运行时类型识别(仅用于多态场景)

dynamic_cast用于将一个父类对象的指针转换为子类对象的指针或引用(动态转换)。在多态中,我们知道,子类对象、指针、引用都可以用父类对象或者指针去接收,这由语法自动完成切片。不太懂的可以看看这里。https://blog.youkuaiyun.com/Vickers_xiaowei/article/details/82750286#_98

向上转型:子类对象指针->父类指针/引用(不需要转换,自动完成切片)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)

  1. dynamic_cast只能用于含有虚函数的类
  2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0。
#include<iostream>
using namespace std;

class Person{
protected:
	string _name;
	virtual void Print()
	{
		cout << "I am the father" << endl;
	}
};

class Student :public Person
{
public:
	int _num;
	virtual void Print()
	{
		cout << "I am the son" << endl;
	}
};
void Func(Person* p)
{
	//父类对象指针->子类指针/引用
	Student* sp = dynamic_cast<Student*>(p);//只允许子类对象指针转换
	sp->Print();
}
int main()
{
	Person p;
	Student s;
	//Func(&p);//使用dynamic_cast,不能将父类指针转换成子类指针,防止了越界行为
	Func(&s);
	system("pause");
	return 0;
}

涉及多态的类型转换最好使用dynamic_cast,防止越界。

static_cast ----相关类型转换

static_cast用于非多态类型的转换(静态转换) ,任何标准转换都可以用它,但它 不能用于两个不相关的类型进行转换。 这里所谓的相关类型和C语言中可以隐式转换的相近类型概念基本一样,C++使用static_cast更加明显,增强了可读性。

#include<iostream>
using namespace std;
int main()
{
	int a = 10;
	int*p = static_cast<int*>(&a);
	*p = 20;
	cout << a << endl;
	system("pause");
	return 0;
}

reinterpret_cast----不相关类型转换

reinterpret_cast操作符用于将一种类型转换为另一种不同的类型。与C语言的强制转换可读性更好。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int a = 10;
	int*p = &a;

	int b = reinterpret_cast<int>(p);
	system("pause");
	return 0;
}

少用类型转换,多使用C++标准的强制转换

拓展1):explicit关键字

对于单参数构造函数会将单参数隐式类型转换。

#include<iostream>
using namespace std;

class A
{
public:
	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;
	system("pause");
}

上述代码将int类型隐式转换成了自定义类型A,如果不想让这样的隐式类型转换,对于单参数类型转换,explicit关键字阻止经过转换构造函数进行的隐式转换的发生。
在这里插入图片描述

拓展 2)类型提升

#include<iostream>
using namespace std;

int main()
{
	size_t pos = 0;
	int end= 3;
	while (end >= pos)
		--end;
	system("pause");
	return 0;
}

int类型的end与size_t类型的pos在比较时候,会将end的int类型提升到size_t,类型提升总是提升到范围大的那一个,所以上面无符号的-1比0大,上面代码会陷入死循环。

C++强制类型转换及代码示例 C++强制类型转换 阅读详情

相关推荐

Vivado ILA抓不到低频信号?试试Capture Control模式,保姆级配置教程(附PWM调试实例)

本文详细解析了Vivado ILA的Capture Control模式在低频信号捕获中的应用,特别针对PWM调试等场景提供保姆级配置教程。通过条件采样和时间拉伸技术,有效解决传统ILA采样在低频信号调试中的存储深度不足、关键信号丢失等问题,并附赠呼吸灯PWM的完整调试实例,帮助FPGA开发者提升调试效率。

weixin_42549451的博客 349

常用字符编码转换函数

#include #include /// @brief ascii和unicode之间的编码转换  size_t ascii_to_unicode(const char* src, wchar_t* dest, size_t dest_len, size_t

tanyaliji的专栏 635

速腾Helios-16P使用Lego-loam实时构建点云地图(二)——Lego-loam的编译与运行

不兼容的问题,打开lego-loam的~/lego-loam_ws/src/LeGO-LOAM/LeGO-LOAM/src下的4个源码文件,搜索/camera_init,将所有/camera_init改成camera_init,也就是去掉斜杠,这样再回到工作空间重新编译lego-loam。3、速腾16线激光雷达RS-16 ----- 3D建图算法LeGO-LOAM的使用(Ubuntu18.04 + ROS Melodic)_速腾16线 lego loam_杰尼君的博客-优快云博客。

qq_59475883的博客 2568

【C++】四种强制类型转换

静态转换:static_cast、动态转换:dynamic_cast、重新解释:reinterpret_cast、常量转换(去常性):const_cast

lxylxylxy的博客 1万+

使用fairseq从头开始训练一个中英神经机器翻译模型

前言 由于毕设是做神经机器翻译相关,所以先尝试一下神经机器翻译的整个流程是非常有必要的。故将在news-commentary-v15语料上训练有监督中英NMT模型的整个流程,包括工具和数据的准备、数据的预处理、训练及解码等过程,以及过程中遇到的问题和解决方案记录在此,以供后期回顾,也希望能够给予别人一些帮助。附本人博客 1 相关工具及目录结构 1.1 相关工具 除jieba是使用pip install安装外,其他几个工具都是建议直接克隆库到自己的用户目录中,方便使用其脚本(moses/subword-nmt

qq_42734797的博客 2万+

uniapp [安卓苹果App端] - 详细实现下载文件保存到用户手机本地,指定文件存储位置路径及文件夹名称下载并保存,Uniapp app端将文件下载保存并储存到指定目录(手机系统存储空间权限检测)

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,app端下载文件,移动端文件下载,并保存到手机本地存储空间,uniapp下载文件保存到手机本地,iOS下载文件怎么保存,系统读写存储空间权限,下载文件到本地详细流程及源代码,保存自定义目录,uniapp,实现下载文件并保存到本地,文件后缀,如何指定手机的存放目录路径url,点击下载文档到手机中并提示存储位置,如何在uniapp中实现文件下载功能,uniApp文件下载,怎么指定文件保存目录,下载报错,没反应

🏆 前端领域优质创作者 1万+

C++的四种强制类型转换

目录 1、C语言中的类型转换 2、为什么C++需要四种类型转换 3、C++强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast 4、RTTI(了解) 5、常见面试题

bit_zyx的博客 1万+

阅文集团大数据面试题及参考答案

在 Flink 中,watermark 是一种用于处理乱序事件时间的机制。实现接口:通常需要实现 AssignerWithPeriodicWatermarks 或 AssignerWithPunctuatedWatermarks 接口。前者会周期性地生成 watermark,后者则是基于某些特定事件来生成 watermark ,比如接收到某个特定值的消息时。定义位置:可以在数据源处或者在流处理的中间操作中定义 watermark。在数据源定义时,能更精准地根据数据的产生特性设置 watermark;

大模型大数据攻城狮的专栏 1088

C++ 强制类型转换

需要注意的是,使用 const_cast 去掉常量性质并修改数据可能导致未定义的行为。:这种类型转换允许进行任何指针或整型的转换。它可以将任何类型的指针转换为任何其他类型的指针,也可以将任何类型的指针转换。它可以用于基本数据类型之间的转换,也可以用于指向父类和子类之间的指针或引用的转换。向下转换(基类转换为派生类)没有动态类型检查,是不安全的。reinterpret_cast要转换的类型必须是指针类型、引用或算术类型。④用于类层次结构中基类和派生类之间指针或引用的转换。③把空指针转换成目标类型的指针。

2201_75772333的博客 2509

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

修复Oracle MySQL Server 安全漏洞(CVE-2023-0464)

路~可以走过 3683

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9700

【C++】深度解析C++的四种强制转换类型(小白一看就懂!!)

在之前我们学过,变量的数据类型可以强制转换为其他数据类型。但由于这种C风格的类型转换可能会出现一些问题,即过于松散的情况,因此C++提出了更加规范、严格的类型转换,添加了四个类型转换运算符,进而更好的控制类型转换过程。

weixin_45031801的博客 2万+

机器人常用坐标系详解:原理、获取方法及实战实例

本文系统阐述了机器人四大核心坐标系(世界、基、工具、工件)的原理与标定方法。世界坐标系提供全局参考基准,基坐标系绑定机器人本体,工具坐标系定义末端执行器位置,工件坐标系则锁定作业对象位置。通过齐次变换矩阵实现各坐标系间的关联转换。重点介绍了三类标定技术:手动设定法(世界坐标系)、三点/六点法(工具TCP标定)和视觉识别法(工件标定),并以工业机械臂上下料为例演示了完整应用流程。随着技术发展,自动化标定、动态坐标系等新趋势将进一步提升机器人作业精度与效率。

start_up_go的博客 513

C++四种强制类型转换

文章目录1 C++类型转换本质1.1 自动类型转换(隐式)1.2 强制类型转换(显式)1.3 类型转换的本质1.4 类型转换的安全性2 四种类型转换运算符2.1 C语言的强制类型转换与C++的区别3 static_cast4 reinterpret_cast5 const_cast6 dynamic_cast6.1 向上转型(Upcasting)6.2 向下转型(Downcasting) 1 C++类型转换本质 1.1 自动类型转换(隐式) 利用编译器内置的转换规则,或者用户自定义的转换构造函数以及类型转换

u_hcy2000的博客 1万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【C++】听说了吗,C++引入了四种强制类型转换

如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化,转换的前提是类型之间有一定的关联。 2、C++中的类型转换 上面举的例子都是内置类型之间,而内置类型和自定义类型之间、自定义类型和自定义型之间都是可以通过一定的方式互相转换的。| 内置类型和自定义类型之间:在前面的学习中我们经常说:单参数构造函数支持隐式类型转换,多参数也可以通过加进行隐式类型转换。 C++支持内置类型隐式类型转换为类类型对象,需要有相关内置类型为参数的构造函数 构造

小羊的博客 3720

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

探索C++类型转换与强制类型转换

1.背景介绍 C++是一种强类型的编程语言,类型安全性是其核心特性之一。类型转换和强制类型转换在C++中具有重要的作用,可以让我们更好地控制数据类型和数据操作。在本文中,我们将深入探讨C++类型转换与强制类型转换的核心概念、算法原理、最佳实践以及实际应用场景。 1. 背景介绍 在C++中,数据类型是一种用于描述数据的抽象,它决定了数据的存储方式、操作方法以及与其他数据类型的关系。类型转换是指...

AI天才研究院 1228

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++之强制类型转换

C++中的强制类型转换是一种将一个数据类型转换为另一个数据类型的操作。在C++中,有四种类型的强制类型转换:静态转换、动态转换、常量转换和重新解释转换。(1)静态转换(static_cast):静态转换是最常用的一种类型转换,它可以在不同但相关的类型之间进行转换,如基本数据类型之间的转换、父类指针向子类指针的转换等。但是需要注意的是,静态转换没有运行时类型检查,因此在进行转换时需要确保类型之间是相关的,否则可能会导致错误。

专注 3031

关于C++四种强制类型转换

其中static_cast还是比较常用于void*类型的转化,reinterpret_cast是和static_cast横向对比的,一般来说。我们定义了一个const,就是不想让其改变,若是我们在代码随便一个地方使用const_cast就能改变常量值,那么对于大的项目来说,可能就完全乱套了。查看运行结果,问题来了,指针p和指针q都是指向a变量的,指向地址相同,而且经过调试发现002CFAF4地址内的值确实由10被修改成了20,这是怎么一回事呢?那么const_cast<>()怎么发挥作用的呢?

m0_73743517的博客 1670

C++的强制类型转换

C++因为兼容C的特性,对于C中的强制类型转换也是可以利用的 先来叙述强制类型转换的全过程 数据类型排名(从高到低):long double,double,float,unsigned long long int,long long int,unsigned long int,long int,unsigned int,int 有两个规则要注明: /* 规则 1:char、short 和 unsigned short 值自动升级为 int 值。细心的读者可能已经注意到,char、short 和 unsign

遇事不决,问春风 8027

C++_强制类型转换

C++为了规范强制类型转换的可观性与安全性,引入了4种强制类型转换符,他们分别是:static_cast、reinterpret_cast、const_cast、dynamic_cast。

安权_code的博客 1122
上一篇: C++单例模式
下一篇: HTTP协议
平头哥阿威
博客等级 码龄9年 509粉丝 175原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值