【C++】C++的类型的转换

目录

C语言中的类型转换

C++中的类型转换

C++强制类型转换

static_cast

reinterpret_cast

const_cast

dynamic_cast


C语言中的类型转换

C语言中又两种类型转换:(强制)显示类型转换和隐式类型转换。

(强制)显示类型转换:指针之间  整形和指针之间

隐式类型转换:整形之间  浮点数和整形之间

没有关联的类型不支持转换。

C++中的类型转换

C++兼容C语言,支持使用C语言的类型转换风格。

C++支持内置类型->自定义类型,同时也支持自定义类型->内置类型,也支持自定义类型->自定义类型:

class A
{
public:A(int a):_a(a){}A(int a, int b):_a(a),_b(b){}operator int(){return _a + _b;}
private:int _a = 1;int _b = 1;
};int main()
{//内置类型->自定义类型A a1 = 2;A a2 = { 5,9 };//自定义类型->内置类型int x = a1;cout << x << endl;//自定义类型->自定义类型,需要用构造函数支持return 0;
}

C++强制类型转换

C语言的强制类型转换有些笼统,C++为了加强类型转换的可视性,引入四种强制类型转换操作符,对C语言的强制类型转换更清晰地划分。

static_cast、reinterpret_cast、const_cast、dynamic_cast

static_cast

用于隐式类型转换,类型之间比较接近的。

reinterpret_cast

用于强制类型转换。但是,C语言中之前不支持的强制转换现在依然不支持。

const_cast

const_cast用于删除变量的const属性,方便赋值。

我们先来看一个例子,const int a=1;a不是在常量区,而是在栈上,我们可以通过打印地址观察:

这种const修饰的变量叫常变量,只是在语法上不能修改。如果想修改它的值,也不是不可以:

我们发现,在内存中,x的值已经变了,但是打印出来的还是原来的值,这其实源自编译器的优化,编译器觉得,x是const修饰的,应该不会被改变,a直接先存到寄存器中,之后还是从寄存器中取,所以打印结果没有改变(VS下是编译时直接把x替换成1了)。这时,我们可以加关键字volatile,告诉编译器这个变量每次都去内存中去取。

 从这个例子可以看出,把const属性去掉是很危险的,所以,C++单独用const_cast来支持。

dynamic_cast

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

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

注意:1.dynamic_cast只能用于父类含有虚函数的类。

2.dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0

class A
{
public:virtual void f() {}public:int _a = 0;
};
class B : public A
{
public:int _b = 0;
};void func(A* pa)
{//dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回B* pb = dynamic_cast<B*>(pa);if (pb){cout << pb << "->转换成功"<< endl;pb->_a++;}else{cout << "转换失败" << endl;}
}int main()
{A a;B b;func(&a);func(&b);return 0;
}

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

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

相关文章

Linux系统服务——【web,http协议,apache服务和nginx服务】(sixteen day)

一、web基础以及http协议 1、web基本概念和常识 前端开发一般用uniapp. 1、Web:为用户提供的一种在互联网上浏览信息的服务&#xff0c;Web 服务是动态的、可交互的、跨平台的和图形化的。 2、Web 服务为用户提供各种互联网服务&#xff0c;这些服务包括信息浏览服务&#xf…

mdk输出行号、文件名、函数名

mdk输出行号、文件名、函数名 printf("File:%s\n" , __FILE__); printf("Fun :%s\n" , __func__); printf("Line:%d\n" , __LINE__); 特此记录 anlog 2024年7月29日

深入源码:解析SpotBugs (3) Detector

文章目录 OpcodeStackDetector常用套路调用栈visit code类检测方法检测代码行检测 前面的博客也提到过&#xff0c;Spotbugs 里面 Detector2 与 Detector&#xff0c;FindBugs2 与 FindBugs&#xff0c;GUI2与GUI&#xff0c;可以视为 Spotbugs 与 FindBugs 新老技术的碰撞&…

Python将多个可迭代对象(如列表、元组、集合等)连接成一个单一的迭代器

Python将多个可迭代对象(如列表、元组、集合等)连接成一个单一的迭代器 itertools.chain 是 Python 标准库中 itertools 模块提供的一个函数,用于将多个可迭代对象(如列表、元组、集合等)连接成一个单一的迭代器。它允许你在循环中一次性遍历多个序列,而不需要先将它们合…

STM32单片机C语言:继电器控制220v灯泡亮灭

本文旨在详细阐述如何利用STM32单片机结合继电器模块&#xff0c;实现对220V灯泡亮灭的远程控制。我们将深入探讨继电器的工作原理&#xff0c;构建相应的硬件电路&#xff0c;并提供具体的程序实现步骤&#xff0c;在智能家居与自动化控制领域的应用的比较多。 一、继电器原理…

接口测试支持IDEA插件一键同步API、新增思维导图快速评审测试用例,MeterSphere开源持续测试工具v3.1.0版本发布

2024年7月29日&#xff0c;MeterSphere开源持续测试工具正式发布v3.1.0版本。 在这一版本中&#xff0c;接口测试方面&#xff0c;支持通过IDEA插件一键同步API至MeterSphere&#xff1b;测试管理方面&#xff0c;“测试用例”模块新增通过思维导图模式快捷评审测试用例。在“…

扫码登录方案

以哔哩哔哩扫码登录为例 二维码解码后内容为&#xff1a;https://passport.bilibili.com/h5-app/passport/login/scan?navhide1&qrcode_keye60869ce7f5235c7123175a7effc6f90&frommain-fe-header 扫码登陆&#xff0c;利用已登录设备授权未登录设备登录的方式 扫码…

使用JavaFx Fxml笔记

使用JavaFx Fxml实现账号密码登录 HelloApplication.java&#xff1a;package com.example.dr295cmonth7;import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.geometry.Insets; import javafx.scene.Parent; import javafx.scene.Scene; i…

【论文精读】 | 基于图表示的视频抑郁症识别的两阶段时间建模框架

文章目录 0、Description1、Introduction2、Related work2.1 Relationship between depression and facial behaviours2.2 Video-based automatic depression analysis2.3 Facial graph representation 3、The proposed two-stage approach3.1 Short-term depressive behaviour…

请你谈谈:vue的渲染机制(render)- 2举例说明问题

如何在 Vue 的 render 函数中使用 createElement 方法来创建虚拟节点&#xff08;VNode&#xff09;。这里是一个稍微整理后的示例&#xff0c;它直接对应于你提供的注释和代码片段&#xff0c;但作为一个完整的 render 函数的一部分&#xff0c;可能位于一个 Vue 组件的 scrip…

智能教室监控系统:使用YOLO和深度学习进行人员检测

基于深度学习的教室人员检测系统&#xff08;UI界面YOLOv8/v7/v6/v5代码训练数据集&#xff09; 1. 引言 在学校管理中&#xff0c;教室内的人员检测和管理是保证教学质量和安全的重要环节。传统的人工检测方法效率低下且容易出错。随着深度学习技术的发展&#xff0c;基于计…

javascript(一)

一、基本语法 1.位置 (1)JavaScript脚本必须位于<script>与</script>之间 (2)<script>标签可以位于<body>或者<head>部分中 2.输出语句 (1)window.alter() 弹出警告框 (2)document.write() 可以将内容在网页中打印出来&#xff0c;同时也…

二维01背包 背包滚动数组 分割等和子集 DAY22

11.背包理论基础 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品只能用一次&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 背包问题有多种背包方式&#xff0c;常见的有&#xff1a;01背包、完全…

进程间通信方式--管道

每个进程的用户地址空间都是独立的&#xff0c;一般而言是不能互相访问的&#xff0c;但内核空间是每个进程都共享的&#xff0c;所以进程之间要通信必须通过内核。 管道 管道的linux命令&#xff1a;ps auxf | grep mysql 上面命令行里面的竖线就是一个管道&#xff0c;它的功…

Laravel模型工厂:高效构建测试数据的秘诀

Laravel模型工厂&#xff1a;高效构建测试数据的秘诀 引言 在软件开发过程中&#xff0c;测试是确保代码质量和功能正确性的关键环节。Laravel框架提供了一套强大的工具来支持测试&#xff0c;其中模型工厂&#xff08;Model Factories&#xff09;是构建测试数据的利器。模型…

新手vue学习问题汇总(自用)(长期更新)

1.export default export default 是 ES6 模块语法&#xff0c;用于导出模块的默认成员。在 Vue.js 中&#xff0c;通常用来导出一个组件对象&#xff0c;使其可以在其他文件中被导入并使用。 2.props props 是组件接收外部数据的方式。父组件可以通过向子组件传递 props 来…

紫杉醇生物合成机制研究进展-文献精读35

紫杉醇生物合成机制研究进展 摘要 紫杉醇是目前已发现的最具抗癌活性的天然广谱抗癌药物之一&#xff0c;其生产方式主要依赖于从珍稀植物红豆杉中进行分离提取以及化学半合成&#xff0c;因其含量稀少&#xff0c;生产能力受到严重的限制。随着红豆杉基因组的全解析和合成生…

如何在 Windows 上安装并配置 VNC 远程连接树莓派,并结合Cpolar实现公网远程访问

目录 ⛳️推荐 前言 1. 使用 Raspberry Pi Imager 安装 Raspberry Pi OS 2. Windows安装VNC远程树莓派 3. 使用VNC Viewer公网远程访问树莓派 3.1 安装Cpolar步骤 3.2 配置固定的公网地址 3.3 VNC远程连接测试 4. 固定远程连接公网地址 4.1 固定TCP地址测试 ⛳️推荐…

内网隧道学习笔记

1.基础&#xff1a; 一、端口转发和端口映射 1.端口转发是把一个端口的流量转发到另一个端口 2.端口映射是把一个端口映射到另一个端口上 二、http代理和socks代理 1.http带那里用http协议、主要工作在应用层&#xff0c;主要用来代理浏览网页。 2.socks代理用的是socks协议、…

编码器如何在stm32上使用?

编码器如何在stm32上使用 文章目录 编码器如何在stm32上使用1. 编码器是什么&#xff1f;2. 如何在stm32上使用编码器1. 编码器的基本原理2. STM32上的实现3. 代码实现 1. 编码器是什么&#xff1f; 编码器是一种传感器或设备&#xff0c;用于测量位置、角度或速度&#xff0c…