类型转换(C++)

    • 1.5 类型转换
      • 1.5.1 隐式类型转换
      • 1.5.2 显示类型转换

1.5 类型转换

类型转换分为隐式转换显示转换

写C/C++代码的时候,有时候不可避免的会使用类型转换,良好的代码风格中应该避免隐式转换,隐式转换有时候会产生不易察觉的问题。

1.5.1 隐式类型转换

C++定义了一套标准数据类型转换的规则,在必要时C++会用这套规则进行数据类型的转换。这种转换是在程序员不参与的情况下自动进行的,所以为隐式类型转换。转换原则:
在这里插入图片描述

一下四种常见类型会发生隐式转换:

  • 多种数据类型的算术表达式中

    int a = 2;
    float b = 3.14;
    double c = 6.5;
    a+b+c;
    
  • 将一种数据类型赋值给另一种数据类型变量

    int a = 2;
    float b = 3.14;
    long double c = 6.5;
    b = a;
    c = a;
    
  • 函数调用时,若实参表达式与形参的类型不相符

    int min(int a, int b) {return a > b ? a : b;
    }
    int a = 3;
    float b = 3.3;
    int x = min(b, a + 3.6);
    
  • 函数返回时,如果返回表达式的值与函数返回类型不同

    double add(int a, int b) {return a + b;
    }
    

1.5.2 显示类型转换

显示类型转换也称为强制类型转换,是指把一种数据类型强制转换成另一种数据类型。

int a = 4;
float c = (float) a;//C风格 C++也支持
float d = float(a);//C++风格 C不支持

C++提供了更严格的类型转换,可以提供更好的控制转换过程,C++增加了四个强制转换运算符:

static_cast,dynamic_cast,const_cast和reinterpret_cast.

  • 静态类型转换 static_cast

    • 目标类型变量 = static_cast<目标类型> (源类型变量)
    • 用于隐式转换的逆转换,常用于基本类型之间的转换,void* 转换为其它类型的指针
    • 不能用于整型和指针之间的互相转换,不能用于不同类型的指针、引用之间的转换(风险高)
    #include <iostream>
    #include <cstdlib>
    using namespace std;int main(void) {int a = 100;double a1 = (double)a;//c风格double a2 = double(a);//c++风格double b = static_cast<double>(a);void *p = malloc(100);int *pi = static_cast<int *> (p);char *pc = static_cast<char *> (p);//    int num = p; //如果从C的角度来看(或搞底层开发的人员来看)我们眼里只有内存,没有什么数据类型,在32位的机器上num变量占4字节,p指针也是对应4字节内存,严格来说这是没问题的,就是把p指针4字节内存搬到num变量4字节内存中了,数据又没有丢,但是在C++中直接这样写是编译不通过的(C++比较严格)。//int num = static_cast<int>(p); // error 整型和指针之间//pc = static_cast<char *>(pi); // error 不同类型的指针return 0;
    }
    
    • 用于自定义类型的转换(向上造型)
  • 重解释类型转换 reinterpret_cast

    • 目标类型变量 = reinterpret_cast<目标类型> (源类型变量)
    • 用于任意类型指针或引用之间的转换
    • 指针和整型数之间的转换
    #include <iostream>
    #include <cstdlib>
    using namespace std;int main(void) {void *p = malloc(100);int *pi = static_cast<int *> (p);char *pc = static_cast<char *> (p);//int num = static_cast<int>(p); // error//pc = static_cast<char *>(pi); // errorint num = reinterpret_cast<int>(p);pc = reinterpret_cast<char *>(pi);int n = 0x00414243;char *ps = reinterpret_cast<char *>(&n);cout << ps << endl; //CBAcout << hex << n << endl; //414243return 0;
    }
    
  • 常类型转换 const_cast

    • 目标类型变量 = const_cast<目标类型> (源类型变量)
    • 用于去除指针或引用的常属性
    #include <iostream>
    using namespace std;int main (void) {int num = 2;const int *p1 = &num;// (*p1)++; // errorint *p2 = const_cast<int *>(p1);*p2 = 100;cout << num << endl;return 0;
    }
    
  • 动态类型转换 dynamic_cast

    • 目标类型变量 = dynamic_cast<目标类型> (源类型变量)
    • 主要用于多态中类指针的向下转型,可以检测是否可以转型成功
    
    

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

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

相关文章

翻译: ChatGPT Token消耗粗略计算英文就是除以四分之三

在这个视频中&#xff0c;我想带你快速浏览一些例子&#xff0c;以建立对在软件应用中使用大型语言模型的实际成本的直观感受。让我们来看看。这是一些示例价格&#xff0c;用于从不同的大型语言模型获取提示和回应&#xff0c;这些模型对开发者可用。即&#xff0c;如果你在你…

【MYSQL】-库的操作

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统(四)用户管理、部门管理模块

第一篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;一&#xff09;搭建项目 第二篇&#xff1a;【Go】基于GoFiber从零开始搭建一个GoWeb后台管理系统&#xff08;二&#xff09;日志输出中间件、校验token中间件、配置路由、基础工具函数。 …

第三讲GNSS相关时间系统和转换 第四讲观测值的产生和分类 | GNSS(RTK)课程学习笔记day2

说明&#xff1a;以下笔记来自计算机视觉life吴桐老师课程&#xff1a;从零掌握GNSS、RTK定位[链接]&#xff0c;从零掌握RTKLIB[链接]。非原创&#xff01;且笔记仅供自身与大家学习使用&#xff0c;无利益目的。 第三讲 GNSS相关时间系统和转换 GPS卫星的位置在时间过程中是…

Java基础语法之内部类

什么是内部类 就是在一个类中又定义了另一个类 分类 实例内部类 即未被static修饰的内部类 1.外部类中的任何成员都可以在内部类里面直接访问&#xff0c;不管这个成员是什么权限 2.内部类对象的创建必须是在有外部类成员的前提下 这是错误的&#xff0c;那如何实例化呢&a…

你知道在MyBatis中传参的#{}和${}的区别吗???

首先我们先将其区别列举出来&#xff1a; 首先演示sql注入&#xff1a; 基于上两篇博客的准备工作&#xff0c;继续开发&#xff1a;MyBatis的删除、修改、插入操作&#xff01;&#xff01;&#xff01;-CSDN博客 #{}的使用 UserMapper.java: User testLogin(User user); U…

时序预测 | Python实现GRU-XGBoost组合模型电力需求预测

时序预测 | Python实现GRU-XGBoost组合模型电力需求预测 目录 时序预测 | Python实现GRU-XGBoost组合模型电力需求预测预测效果基本描述程序设计参考资料预测效果 基本描述 该数据集因其每小时的用电量数据以及 TSO 对消耗和定价的相应预测而值得注意,从而可以将预期预测与当前…

手把手教你搭建谷歌Gemini

前言 谷歌上周推出了一款名为 Gemini 的多模态大模型&#xff0c;并且现在发布了免费开放的 Gemini API 供开发者使用。根据谷歌提供的定价信息&#xff0c;Gemini 有两种收费方式。免费版本每分钟可以进行 60 次请求&#xff0c;足够满足个人用户的需求。收费版本目前暂不可用…

【无语】Microsoft Edge 浏览器不显示后台返回的数值数据

Microsoft Edge 禁用 JSON 视图 写在前面禁用 JSON 视图 写在前面 遇到一个有意思的事情&#xff0c;在用 Microsoft Edge 浏览器发送请求测试时发现&#xff0c;后端返回的数值数据没有正常展示&#xff0c;而是类似查看源码的结果&#xff0c;只显示了一个行号1&#xff0c;…

visual stdio code运行vue3

npm init vuelatest 该命令初始化vue项目 使用visual stdio code创建vue项目 ,这边是vue-project文件夹 vs code打开项目 vscode操作vue项目 vscode操作vue项目

Java 数据结构篇-实现二叉搜索树的核心方法

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 二叉搜索树的概述 2.0 二叉搜索树的成员变量及其构造方法 3.0 实现二叉树的核心接口 3.1 实现二叉搜索树 - 获取值 get(int key) 3.2 实现二叉搜索树 - 获取最小…

大创项目推荐 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

升华 RabbitMQ:解锁一致性哈希交换机的奥秘【RabbitMQ 十】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 升华 RabbitMQ&#xff1a;解锁一致性哈希交换机的奥秘【RabbitMQ 十】 前言第一&#xff1a;该插件需求为什么需要一种更智能的消息路由方式&#xff1f;一致性哈希的基本概念&#xff1a; 第二&…

很抱歉,Midjourney,但Leonardo AI的图像指导暂时还无人能及…至少目前是这样

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【VScode】设置语言为中文

1、下载安装好vscode 2、此时可看到页面为英文&#xff0c;为方便使用可切换为中文 3、键盘按下 ctrlshiftP 4、在输入框内输入configure display language 5、选择中文&#xff0c;restart即可&#xff08;首次会有install安装过程&#xff0c;等待安装成功后重启即可&am…

【Python炫酷系列】一闪一闪亮星星,漫天都是小星星(完整代码)

文章目录 环境需求完整代码详细分析系列文章环境需求 python3.11.4及以上版本PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.…

Python 爬虫之简单的爬虫(四)

爬取动态网页&#xff08;下&#xff09; 文章目录 爬取动态网页&#xff08;下&#xff09;前言一、大致内容二、基本思路三、代码编写1.引入库2.加载网页数据3.获取并保存4.保存文档 总结 前言 上篇主要讲了如何去爬取数据&#xff0c;这篇来讲一下如何在获取的同时将数据整…

利用canvas封装录像时间轴拖动(uniapp),封装上传uniapp插件市场

gitee项目地址,项目是一个空项目,其中包含了封装的插件,自己阅读,由于利用了canvas所以在使用中暂不支持.nvue,待优化; 项目也是借鉴了github上的一个项目,timeline-canvas,​​​​​​​ ​​​​​​​

【2.2操作系统】进程管理

目录 1.进程的基本概念2.进程的状态3.信号量与PV操作4.前趋图5.死锁6.银行家算法 1.进程的基本概念 &#x1f31f;进程是程序在一个数据集合上运行的过程&#xff0c;它是系统进行资源分配和调度的一个独立单位。它由程序块、进程控制块 (PCB) 和数据块三部分组成。 &#x1f…

Kubernetes 的用法和解析 -- 5

一.企业级镜像仓库Harbo 准备&#xff1a;另起一台新服务器&#xff0c;并配置docker yum源&#xff0c;安装docker 和 docker-compose 1.1 上传harbor安装包并安装 [rootharbor ~]# tar xf harbor-offline-installer-v2.5.3.tgz [rootharbor ~]# cp harbor.yml.tmpl harbor…