C++类型转换

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

隐式转换类型

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

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

  • 多种数据类型的算数表达式中
int a = 2;
float b = 3.4;
double d = 2.2;
a+b+d;
  • 将一种数据类型赋值给另外一种数据类型变量
  • int a = 2;
    float b = 3.4;
    long double d = 2.2;
    b = a;
    d = a;
    

    函数调用时,若实参表达式与形参的类型不符时

  • int main(int a, int b) {return a<b?a:b;
    }
    int a = 2;
    float b = 3.4;
    int x = main(b, a+3.5);

    函数返回时,如果返回表达式的值域函数返回类型不同时

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

    显示类型转换(了解)

  • 显示类型转换也称为强制类型转换,是指把一种数据类型强制转换为指定的另一种数据类型。
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*转换为其他类型的指针
  • 不能用于整型和指针之间的互相转换,不能用于不同类型的指针、引用之间的转换(风险高)
int main(int argc, const char *argv[])
{int a = 100;double b = a;cout << b <<endl;char c = char(a);cout << c << endl;float f = static_cast<float>(a);cout << f <<endl;void *p;p = malloc(100);int *q = static_cast<int *>(p);char *m = static_cast<char *>(q);q = m;//errnoreturn 0;
}

重解释类型转换reinterpret_cast

  • 目标类型变量 = reinterpret_cast<目标类型>(源类型变量);
  • 用于任意类型指针或引用之间的转换
  • 指针和整型数之间的转换;
  • 高风险转换
#include <cstdlib>using namespace std;int main(int argc, const char *argv[])
{void *p;p = malloc(100);int *q = static_cast<int *>(p);int m = reinterpret_cast<int>(p);char *n = reinterpret_cast<char *>(q);//char l = reinterpret_cast<char>(q);//errnoint a = 0x00414243;char *b = reinterpret_cast<char *>(&a);cout << b << endl;cout << hex << a << endl;return 0;
}

const_cast(去除常量转换)

#include <iostream>
using namespace std;int main(int argc, const char *argv[])
{int a = 200;const int *p = &a;//(*p)++;//错误,不能运算cout << *p << endl;int *q = const_cast<int *>(p);cout << *q << endl;return 0;
}

动态类型转换dynamic_cast

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

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

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

相关文章

服务器被攻击宕机的一些小建议

现在网络攻击屡有发生&#xff0c;任何网站服务器都面临这样的危险&#xff0c;服务器被攻击造成的崩溃宕机是损失是我们无法估量的。网络攻击我们无法预测&#xff0c;但做好防御措施是必须的&#xff0c;建议所有的网站都要做好防范措施&#xff0c;准备相应的防护预案&#…

GD32F4标准外设库

学习目标 了解标准库来源熟悉模板搭建流程掌握在已有模板基础下进行开发学习内容 标准外设库获取 标准固件库获取我们可以从官网进行下载。 下载链接:兆易创新GigaDevice-资料下载兆易创新GD32 MCU 找到 GD32F4xx Firmware Library 这个压缩包 下载完成后,进行解压,解压…

自然语言处理阅读第一弹

Transformer架构 encoder和decoder区别 Embeddings from Language Model (ELMO) 一种基于上下文的预训练模型,用于生成具有语境的词向量。原理讲解ELMO中的几个问题 Bidirectional Encoder Representations from Transformers (BERT) BERT就是原生transformer中的Encoder两…

前端常用的几种算法的特征、复杂度、分类及用法示例演示

算法&#xff08;Algorithm&#xff09;可以理解为有基本运算及规定的运算顺序所构成的完整的解题步骤&#xff0c;或者看成按照要求设计好的有限的确切的计算序列&#xff0c;并且这样的步骤和序列可以解决一类问题。算法代表着用系统的方法描述解决问题的策略机制&#xff0c…

中医处方软件西医电子处方系统,一键生成处方单可设置配方模板教程

一、前言 有的诊所是中医和西医都有&#xff0c;医师是全科医师&#xff0c;那么所使用的软件既要能开中药处方也要能开西药处方&#xff0c;而且可以通过一键生成配方&#xff0c;则可以节省很多时间。 下面就以 佳易王诊所卫生室电子处方为例说明 如上图&#xff0c;如果是…

Luminar Neo:超强AI图像编辑器,助力你轻松创作完美照片!

如果你是一位热爱摄影和图像编辑的人&#xff0c;那么我相信你一定会喜欢 Luminar Neo&#xff08;超强AI图像编辑器&#xff09;&#xff01;不仅仅是一款普通的图像编辑软件&#xff0c;Luminar Neo融合了人工智能技术&#xff0c;让你在编辑照片时拥有更多可能性和创意。 L…

逆向经历回顾总结

逆向经历回顾总结 一、前言 将自己的逆向经验做个总结&#xff0c;希望新手对逆向大方向能快速了解。高手有啥不一样的经验也可以讨论讨论。 二、个人经历 本人入行逆向全因一部韩剧“幽灵”&#xff0c;里面涉及渗透、病毒分析、取证的攻防对抗&#xff0c;我觉得对新手来说…

RocketMQ 5.X PopAck 源码拆解

目录 一、RocketMQ 5.X 架构 RocketMQ 5.X 架构RocketMQ 5.X 为什么发明 Pop 二、 Pop流程 Pop 流程 锁 Consumer Queue计算 Pop Offset读取消息添加 Check Point释放 Consumer Queue 锁 Pop 关键数据结构介绍 Pop OffsetCheck PointReceiptHandleStartOffsetInfoMsgOff…

[NAND Flash] 3.3 Flash闪存工艺知识深度解析

依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< 全文 4400 字。 Wafer即晶圆,是半导体组件“晶片”或“芯片”的基材,从沙子里面高温拉伸生长出来的高纯度硅晶体柱(Crystal Ingot)上切下来的圆形薄片称…

计算机网络:物理层(编码与调制)

今天又学会了一个知识&#xff0c;加油&#xff01; 目录 一、基带信号与宽带信号 1、基带信号 2、宽带信号 3、选择 4、关系 二、数字数据编码为数字信号 1、非归零编码【NRZ】 2、曼彻斯特编码 3、差分曼彻斯特编码 4、归零编码【RZ】 5、反向不归零编码【NRZI】 …

Linux Zabbix企业级监控平台本地部署并实现远程访问

前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 本地zabbix web管理界面限制在只能局域…

Elasticsearch:相关性工作台 - BM25 及 ELSER 的相关性比较

我们知道 Elastics Learned Sparse EncoderR (ELSER) 可以被用来做语义搜索。它是一个 out-of-domain 的语义搜索模型。无需训练&#xff0c;我们就可以得到很好的相关性。有关 ELSER 的更多知识&#xff0c;请参考文章 “Elastic Learned Sparse Encoder 简介&#xff1a;Elas…