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

一、C语言中的类型转换

在C语言中有两种类型转换,隐式类型转换和显示类型转换。

如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需要发生类型转化。

隐式类型转换:是编译器在编译期间自动转换,不能转就报错。

显式类型转换:用户自己转换。

int x = 1;
//隐式类型转换
double y = x;
cout << y << endl;int* p = &x;
//用户自己显示类型转换
int addr = (int)p;
cout << addr << endl;

二.C++需要四种强制类型转换的理由

在C语言中有很多类型转换的可视性不是很好或者存在精度问题,如以下可视性例子:

三.C++中四种强制类型转换

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

1.static_cast

static_cast多用于静态转换,简单说就是用于两个相关类型

int x = 1;
double y = static_cast<double>(x);
cout << y << endl;

2.reinterpret_cast

reinterpret_cast用于处理不同类型之间的转换。可以将一个指针或引用转换为另一种类型,且不需要进行任何类型检查或安全检查。

int* p = &x;
int addr = reinterpret_cast<int>(p);
cout << addr << endl;

3.const_cast

const_cast用于去除变量的const属性。

	volatile const int i = 0;int* p = const_cast<int*>(&i);*p = 19;cout << i << endl;cout << *p << endl;

4.dynamic_cast

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

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

向下转型:父类对象指针/引用->子类指针/引用(用dynamic_cast转型是安全的)

注意:

1. dynamic_cast只能用于父类含有虚函数的类

2. dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回nullptr或者抛异常

#include <iostream>class Base {
public:virtual void show() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void show() {std:: cout << "Derived class" << std::endl;}
};int main() {Base* basePtr = new Derived;Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);if(derivedPtr) {derivedPtr->show(); // 输出:Derived class} else {std::cout << "Failed to cast to Derived class" << std::endl;}delete basePtr;return 0;
}

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

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

相关文章

Unity系统学习笔记

文章目录 1.基础组件的认识1.0.组件继承关系图1.1.项目工程文件结构&#xff0c;各个文件夹都是做什么的&#xff1f;1.2.物体变化组件1.2.3.三维向量表示方向1.2.4.移动物体位置附录&#xff1a;使用变换组件实现物体WASD移动 1.3.游戏物体和组件的显示和禁用1.3.1.界面上的操…

C语言入门课程学习笔记2

C语言入门课程学习笔记2 第8课 - 四则运算与关系运算第9课 - 逻辑运算与位运算第10课 - 深度剖析位运算第11课 - 程序中的选择结构 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 第8课 - 四则运算与关系…

共享汽车管理|基于SprinBoot+vue的共享汽车管理系统(源码+数据库+文档)

共享汽车管理目录 基于SprinBootvue的共享汽车管理系统 一、前言 二、系统设计 三、系统功能设计 1 管理员模块的实现 1.1 用户信息管理 1.2 投放地区管理 1.3 汽车信息管理 1.4 汽车入库管理 2 用户模块的实现 2.1 汽车投放 2.2 使用订单管理 2.3 汽车归还 四、…

为AI电脑生态注入强悍动力,安耐美PlatiGemini 1200W高性能电源

在DIY攒机的过程中&#xff0c;电源是非常重要的一环&#xff0c;现在高性能的硬件功耗往往很高&#xff0c;因此一款优秀的电源整个系统稳定运行的基石。最近&#xff0c;我发现一款由安耐美&#xff08;Enermax&#xff09;推出的PlatiGemini 1200W电源&#xff0c;它不仅满足…

刷代码随想录有感(45):二叉树的最大深度

题干&#xff1a; 力扣这里给了定义&#xff1a;二叉树的最大深度指的是从根节点开始&#xff0c;到最远叶子所经过的节点数。 代码&#xff1a; class Solution {//递归实现 public:int maxDepth(TreeNode* root) {if(root NULL)return NULL;int leftheight maxDepth(root…

离散数学之命题逻辑思维导图+大纲笔记(预习、期末复习,考研,)

大纲笔记&#xff1a; 命题逻辑的基本概念 命题与联结词 命题 命题是推理的基本单位 真命题&#xff0c;假命题 特征 陈述句 唯一的真值 是非真即假的陈述句 非命题 疑问句 祈使句 可真可假 悖论 模糊性 三个基本概念 复合命题 真值取决于原子命题的值和逻辑联结词 原子命题 逻…

【leetcode面试经典150题】71. 对称二叉树(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

Mybatis框架怎么查看执行的sql语句

文章目录 一、打开idea搜索mybatis SimpleExecutor类二、找到类中doQuery方法&#xff0c;并打断点二、发请求后&#xff0c;查看boundSql 一、打开idea搜索mybatis SimpleExecutor类 org.apache.ibatis.executor.SimpleExecutor二、找到类中doQuery方法&#xff0c;并打断点 …

外贸订单从初始到成交,都涉及哪些环节?

前言 经常听到这个言论&#xff1a;做外贸不就是找到国外客户&#xff0c;用英文把产品推荐给他们&#xff0c;然后收款。就这么easy&#xff0c;能有多复杂&#xff1f; 没那么简单&#xff0c;外贸是和内销有相通之处&#xff0c;但是过程却完全不同。涉及到的环节还是挺复杂…

为什么要分库分表?(设计高并发系统的时候,数据库层面该如何设计?)

目录 1.分表 2.分库 说白了&#xff0c;分库分表是两回事儿&#xff0c;大家可别搞混了&#xff0c;可能是光分库不分表&#xff0c;也可能是光分表不分库&#xff0c;都有可能。 我先给大家抛出来一个场景。 假如我们现在是一个小创业公司(或者是一个 BAT …

Spark02

Spark02 一. PyCharm创建PySpark项目1. 创建项目,配置环境2. 连接到远服务器3. 程序入口 一. PyCharm创建PySpark项目 1. 创建项目,配置环境 2. 连接到远服务器 3. 程序入口

【THM】Windows Privilege Escalation(Windows权限提升)-初级渗透测试

介绍 在渗透测试期间,您通常可以使用非特权用户访问某些 Windows 主机。非特权用户将拥有有限的访问权限,仅包括其文件和文件夹,并且无法在主机上执行管理任务,从而阻止您完全控制目标。 本房间涵盖攻击者可用来在 Windows 环境中提升权限的基本技术,允许您在可能的情况…

什么是分解交易?fpmarkets一分钟讲清楚

分解交易是什么&#xff1f;用这种交易方式能赚到钱吗&#xff1f;这种策略有什么好处&#xff1f;有什么弊端呢&#xff1f;今天fpmarkets澳福一分钟给各位投资者讲清楚。 其实在fpmarkets看来分解交易就是一种很简单的外汇策略&#xff0c;主要信号是趋势线的分解。看涨趋势线…

this指向

调用方式示例 函数中this的指向通过new调用new method()新对象直接调用method()全局对象通过对象调用obj.method()前面的对象call、apply、bindmethod.call(ctx)第一个参数 我们说的this指向是一个函数里边的this指向&#xff0c;如果这个this不在函数里边&#xff0c;那th…

ShardingSphere-JDBC快速入门

ShardingSphere-JDBC读写分离快速入门 一、ShardingSphere-JDBC 读写分离1.创建springboot程序1.1 添加依赖1.2 java代码1.3 配置 2.测试 二、ShardingSphere-JDBC垂直分片1.创建springboot程序1.1 导入依赖1.2 java代码1.3 配置 2.测试 三、ShardingSphere-JDBC水平分片1.创建…

WPForms Pro插件下载:简化您的在线表单构建,提升用户互动

在当今的数字化世界中&#xff0c;表单是网站与用户互动的关键。无论是收集信息、处理订单还是进行调查&#xff0c;一个好的表单可以极大地提升用户体验和转化率。WPForms Pro插件&#xff0c;作为一款专业的WordPress表单构建工具&#xff0c;旨在帮助您轻松创建美观、功能强…

MySQL无法打开情况下读取frm文件的表结构

一、背景&#xff1a; 开发人员通过MySQL客户端工具&#xff0c;可以访问MySQL5.7.6&#xff0c;可以访问具体的DB&#xff0c;可以查看小写表的数据&#xff0c;但是无法查看大写表的数据&#xff0c;报错信息为“table does not exist”。 二、检查与分析&#xff1a; ssh登录…

mac如何通过Teminal查找本机ip地址

方法1 ifconfig ifconfig终端中使用 ifconfig 可以查看本地 ip 但是看到的信息太多了&#xff0c;我们只是想要一个本机ip而已 方法2 ifconfig en0 ifconfig en0相比方法1我们算是直接获取到了本机ip&#xff0c;但是第一眼看到还是需要反应一段时间 方法3 精准获取IP ifcon…

跑腿业务和支付业务的具体实现流程

校园云项目 跑腿业务的具体业务分析 该流程适用于很多接单相关的业务场景&#xff0c;或多或少都可以从中得到启发&#xff1b; 整个流程描述&#xff1a; 任务发布&#xff1a; 用户在平台上发布任务&#xff0c;描述需要完成的任务内容&#xff0c;包括取件地址、送达地址…

基于文件流操作文件系统

stream 文件流ScannerWriter遍历目录删除指定文件把目标文件复制为源文件小结 文件流 文件的内容本质上都是来自于硬盘,而硬盘由操作系统管理. 使用java来操作文件,就要用到java的api.这里涉及一系列的类: 字节流: InputStream和OutputStream是以操作字节为单位(二进制文件). …