【C++】学习笔记——C++的类型转换

news2024/11/15 11:56:57

文章目录

  • 二十三、C++的类型转换
    • 1. C语言中的类型转换
    • 2. C++类型转换
      • static_cast
      • reinterpret_cast
      • const_cast
      • dynamic_cast
  • 未完待续


二十三、C++的类型转换

1. C语言中的类型转换

在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化,C语言中总共有两种形式的类型转换:隐式类型转换和显式类型转换。
隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译失败。
显式类型转化:需要用户自己处理的转换。

 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);
}

由于类型转换的可视性比较差,难以发觉,于是C++就提出了四种类型转换的关键字。

2. C++类型转换

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

static_cast

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

#include <iostream>
using namespace std;

int main()
{
	double d = 12.34;
	// 将double转换成int
	int a = static_cast<int>(d);
	cout << a << endl;
	return 0;
}

在这里插入图片描述

reinterpret_cast

reinterpret_cast操作符通常用于将一种类型转换为另一种不同的类型,相当于C语言的显示(强制)类型转换。

#include <iostream>
using namespace std;

int main()
{
	double d = 12.34;
	int a = static_cast<int>(d);
	cout << a << endl;
	int* p = reinterpret_cast<int*>(a);
	cout << p << endl;
	return 0;
}

在这里插入图片描述

const_cast

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

#include <iostream>
using namespace std;

int main()
{
	// 不让编译器优化,避免将const值存到寄存器中
	volatile const int a = 2;
	int* p = const_cast<int*>(&a);
	*p = 3;
	cout << a << endl;
	cout << p << endl;
	return 0;
}

在这里插入图片描述

dynamic_cast

dynamic_cast主要用于继承中。子类转换成父类时,根据赋值兼容规则,是可以直接转换的。但是父类只能转换父类,父类转换子类并不是安全的。而dynamic_cast类型转换则可以帮助检测,如果是父类转换成子类则会返回0。如果安全则正常转换。

#include <iostream>
using namespace std;

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;
}

在这里插入图片描述

C语言的强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,我们应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。强烈建议:避免使用强制类型转换。


未完待续

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

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

相关文章

书单 | 大模型的书那么多,如何快速选到适合自己的那一本?来,教你!

大模型的书这么多&#xff0c;该怎么选呢&#xff1f; 本期书单就来教大家怎么快速地从众多大模型书中选到你想要的那一本&#xff01; 大模型基础 大模型入门不可错过的一本书&#xff0c;就是这本大模型界的经典畅销书**《大规模语言模型》**&#xff01;系统性强&#xf…

Excel函数基础(二)

1、单元格名称 框选单元格&#xff08;不含标题&#xff09;&#xff0c;公式选项卡->定义名称&#xff0c; 或者框选单元格后&#xff0c;在左上角的栏位直接输入要定义的名字&#xff0c;按下enter键即可 这样在使用函数时&#xff0c;数据范围参数可以用定义的名称来替…

4款翻译软件分享,告别职场困境

作为一名初入职场的新人&#xff0c;我经常会遇到各种需要翻译的文件&#xff0c;从合同到项目报告&#xff0c;再到专业资料&#xff0c;无一不考验着我的语言能力。幸运的是&#xff0c;我遇到了几款超级给力的翻译软件——福昕翻译在线、福昕翻译客户端、海鲸AI翻译和deepl翻…

Python | Leetcode Python题解之第310题最小高度树

题目&#xff1a; 题解&#xff1a; class Solution:def findMinHeightTrees(self, n: int, edges: List[List[int]]) -> List[int]:if n 1:return [0]g [[] for _ in range(n)]deg [0] * nfor x, y in edges:g[x].append(y)g[y].append(x)deg[x] 1deg[y] 1q [i for …

太厉害了,使用WebGL SDK居然可以添加这么多图层!

想象一下&#xff0c;你在网页上展示一张地图&#xff0c;不仅有基本的点、线、面&#xff0c;还能叠加三维模型、高分辨率影像、地形数据&#xff0c;甚至实时的车辆轨迹。这听起来是不是很酷&#xff1f;今天&#xff0c;我们就来聊聊如何用Mapmost WebGL SDK&#xff0c;轻松…

【Unity Shader】切线空间下计算凹凸映射

// Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with UnityObjectToClipPos(*)Shader "Unlit/NormalTangent" {Properties{_Color("Color Tint", Color) (1, 1, 1, 1)_MainTex("Main Tex", 2D) "While"{}//法线纹理_BumpMap(&q…

windows11高级电源设置中【睡眠】里面的 【在此时间后休眠】没有了

系统更新后发现电脑的定时休眠功能没了&#xff0c;打开电源选项发现【在此时间后休眠】这个功能直接没了如下 1、添加【在此时间后休眠】选项 step1&#xff1a; 用管理员身份打开命令提示符 step2&#xff1a;输入 reg add HKLM\System\CurrentControlSet\Control\Power /v …

[数据集][目标检测]辣椒病害成熟度检测数据集VOC+YOLO格式2748张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2748 标注数量(xml文件个数)&#xff1a;2748 标注数量(txt文件个数)&#xff1a;2748 标注…

cocos creator 3.x中动态加载 resources 文件夹下的图片时提示找不到

文件目录如下 类型为spriteFrame 代码案例 图片设置为 sprite-frame、texture 或其他图片类型后&#xff0c;将会在 资源管理器 中生成一个对应类型的资源。但如果直接加载 equipments/testea&#xff0c;得到的类型将会是 ImageAsset&#xff0c;必须指定路径到具体的子资源…

微信小程序开发之自定义组件

微信小程序支持自定义组件&#xff0c;允许开发者创建可复用的自定义组件库&#xff0c;提高开发效率并增强代码的可维护性。 自定义组件分为全局组件和局部组件。 一、下面展示全局组件 创建components 目录&#xff0c;如图所示: 创建组件文件夹&#xff1a; 利用微信开发…

常用排序算法的实现与介绍

常用排序算法的实现与介绍 在计算机科学中&#xff0c;排序算法是非常基础且重要的一类算法。本文将通过C语言代码实现&#xff0c;介绍几种常见的排序算法&#xff0c;包括冒泡排序、选择排序、插入排序和快速排序。以下是这些排序算法的具体实现和简要介绍。 1. 冒泡排序&am…

【Redis 进阶】主从复制(重点理解流程和原理)

在分布式系统中为了解决单点问题&#xff08;某个服务器程序只有一个节点&#xff08;只搞一个物理服务器来部署这个服务器程序&#xff09;。可用性不高&#xff1a;如果这个机器挂了意味着服务就中断了&#xff1b;性能 / 支持的并发量比较有限&#xff09;。通常会把数据复制…

免费插件集-illustrator插件-Ai插件-黄金比率绘图

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;绘制黄金比率示意图。首先从下载网址下载这款插件 https://download.csdn.net/download/m0_67316550/87890501&am…

【ESP32接入国产大模型之星火】

【ESP32接入国产大模型之星火】 1. 讯飞星火大模型1.1 了解星火 api1.2 Http接口鉴权1.3 http调用1.3.1 http请求结构体1.3.2 返回(response)参数1.3.3 错误响应 2. 先决条件2.1 环境配置2.2 所需零件 3. 核心代码3.1 源码分享3.2 源码解析 4. 上传验证4.1 对话测试4.2 报错 5.…

【MySQL】一文彻底吃透MVCC执行原理

1.MVCC是什么&#xff1f; MVCC全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制。它通过维护数据的多个版本来实现高效的并发控制&#xff0c;用于在多个并发事务同时读写数据库时保持数据的一致性和隔离性。 在搞清楚MVCC的实现原理之前&#xff0c;还需…

一天攻克一个知识点 —— 设计模式之动态代理

一、设计模式之代理设计 代理设计是在Java开发中使用较多的一种设计模式&#xff0c;所谓的代理设计模式就是指一个代理主体操作真实主体&#xff0c;真实主体操作具体业务&#xff0c;代理主体负责给具体业务添砖加瓦。 就好比在生活中你有一套房子想要出租(你真实主体)&…

Mysql-窗口函数一

文章目录 1. 窗口函数概述1.1 介绍1.2 作用 2. 场景说明2.1 准备工作2.2 场景说明2.3 分析2.4 实现2.4.1 非窗口函数方式实现2.4.2 窗口函数方式实现 3. 窗口函数分类4. 窗口函数基础用法&#xff1a;OVER关键字4.1 语法4.2 场景一 :计算每个值和整体平均值的差值4.2.1 需求4.2…

免费的远程办公软件

产生背景 我们的SD-WAN组网的产品一直都是以CPE盒子的形式进行交付&#xff0c;如果您有多个企业分支&#xff0c;那么需要在每个分支安装一个CPE盒子。 这种形式存在一些问题&#xff1a; 成本过高&#xff0c;CPE盒子本身是有成本的&#xff0c;没办法做到免费使用&#xf…

用Maven构建项目和管理依赖

运行本篇中的代码&#xff1a;idea专业版或者idea社区版本&#xff08;2021.1~2022.1.4&#xff09; 用Maven构建项目和管理依赖 1. 初见maven2. maven在网站项目中的应用3. maven和idea的关系4. maven的使用4.1 项目构建4.11 在idea创建maven项目4.12 利用maven命令打包项目 4…

“QtGraphicalEffects“ is not installed

【1】问题&#xff1a;qml项目报 module "QtGraphicalEffects" is not installed 【2】解决方法&#xff1a;将qml目录中的"QtGraphicalEffects" 拷贝到工程release目录