在C/C++语言中,类型转换是一个绕不开的话题,所谓类型转换,其含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。C++提供了多种类型转换的方式,下面将分别讲解。

旧式类型转换

旧式类型转换其实就是C风格转换,是从C语言中继承下来的,比如,为了转换一个类型为doubole的浮点数的指针到整型:

或者:

隐式类型转换

C在以下四种情况下会进行隐式转换:

1:算术运算式中,低类型能够转换为高类型。

2:赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型;

3:函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。

4:函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

例如:

C++新式类型转换

上面两种方式不能不分皂白的应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:’reinterpret_cast’, ‘static_cast’, ‘dynamic_cast’ 和 ‘const_cast’,目的在于控制类(class)之间的类型转换。

dynamic_cast

dynamic_cast只用于对象的指针和引用。当用于多态类型时, 其将基类类型对象的引用或指针转换为同一继承层次中其他类型的引用和指针。

当按如下创建一个对象b,Base * derived = new Derived(10); 。则默认derived->sayhi()无法通过编译,因为derived默认所指向的base类中不包含sayhi()。这时候可以利用dynamic_cast将其转换为Derived对象,使sayhi函数可用。

与其他强制转换类型不同,dynamic_cast涉及运行时类型检查,如果绑定到引用或指针的对象不是目标类型的对象,则dynamic_cast失败,返回值为0或抛出一个bad_cast异常。

因此上述代码中,Derived * staticDerived = static_cast (base);转换并不考虑类型检查,因此上述转换为错误的,将一个base对象强制转换成Derived,必然缺失了Derived具有的函数。使用dynamic_cast由于做类型检查,因此非法转换后的值为NULL,而static_cast不能检查转换类型。

const_cast

这个转换类型操纵传递对象的const属性,或者是设置或者是移除:

默认const对象是无法赋值给非const变量的,因此const_cast提供去掉const值的const属性,即可以赋值给非const变量。这里记录下const int number = 10; int tmp = number;是合法,因为tmp与number并非指向同一个对象,而引用和指针则不行。

static_cast

static_cast 允许执行任意的隐式转换和相反转换动作。(即使它是不允许隐式的)。

意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类,如下所示:

static_cast 除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换,如下所示:

reinterpret_cast

reinterpret_cast 是一种高度危险的转换,这种转换仅仅是对二进制位的重新解释。

这个操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。如下所示

IELTS a bit

glimpse n. 一瞥,一看

vi. 瞥见

vt. 瞥见

intelligible adj. 可理解的;明了的;仅能用智力了解的

persistence n. 持续;固执;存留;坚持不懈;毅力

be specific to 特定;针对...而言;仅限于...

show up 漏面;漏出;揭露

推荐阅读:

一大批历史精彩文章啦

【机器学习】决策树的理论与实践

谈谈复杂多分类问题上的一些个人理解

基于汉语短文本对话的立场检测系统理论与实践

【收藏版】长文详解基于并行计算的条件随机场

【珍藏版】长文详解python正则表达式

这些神经网络调参细节,你都了解了吗

谈谈我在自然语言处理入门的一些个人拙见

大数定律和中心极限定理的区别和联系

深度学习之卷积神经网络CNN理论与实践详解

深度学习之RNN、LSTM及正向反向传播原理

TreeLSTM Sentiment Classification

基于attention的seq2seq机器翻译实践详解

【干货】基于注意力机制的seq2seq网络


欢迎关注深度学习自然语言处理公众号,我会每天更新自己在机器学习深度学习NLPlinuxpython以及各种数学知识学习的一点一滴!再小的人也有自己的品牌!期待和你一起进步!

长按识别二维码

【C++】C++中你不了解的类型转换相关推荐

  1. JAVA中int、String的类型转换(亲测)

    int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...

  2. PG中的几种数据类型转换方式

    PG中的几种数据类型转换方式 1.通过格式化函数进行转换 函数 返回类型 描述 示例 to_char(timestamp,text) text 把时间戳转换成字符串 to_char(current_t ...

  3. 通读《C++ primer plus》— C++中的5种数据类型转换方式

    通读<C++ primer plus>-记录一 C++中的5种数据类型转换方式 1.始化和赋值时转换 比如 int a=1; long b=2147483647; a=b; 上面的代码并不 ...

  4. C++中的转换构造函数和类型转换函数

    文章目录 1 C++中的转换构造函数 1.1 转换构造函数 1.2 explicit关键字 2 C++中的类型转换函数 2.1 类型转换函数 3 转换构造函数与类型转换函数之间的冲突 3.1 转换构造 ...

  5. 2.2.3 C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)

    文章目录: 首先看一下c语言整数数据类型范围 1.有符号数和无符号数的转换(相同字长) 2.不同字长整数之间的转换 (1)大字长变量向小字长变量强制类型转换 (2)小字长变量向大字长变量强制类型转换 ...

  6. JAVA中int、String的类型转换

    int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...

  7. oracle long类型转换成字符串_数值类型在计算机中的保存形式以及类型转换的思考和尝试...

    数值分为整型和浮点型两大块.不管是哪种类型,在计算机中都是按二进制形式存储,只有0 和1 两种符号.基本数据类型byte .short .int .long .float .double .常量有整型 ...

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

    转自CSDN 使用标准C++的类型转换符:static_cast.dynamic_cast.reinterpret_cast.和const_cast. 1 static_cast 用法:static_ ...

  9. C语言中结构体的强制类型转换

    最近在学习C语言中的Socket,遇到了结构体强制类型转换的问题,在这里记录一下. 我们看一个例子 struct sockaddr_in seraddr;memset(&seraddr, 0, ...

  10. javascript中让人懵逼的类型转换

    最近在读<你不知道的javascript>系列图书,收获蛮大,感慨也挺多的. 是的,关于javascript,你不是不知道,而是真的不知道.? 就比如类型转换,从开始到看完到第二第三第N遍 ...

最新文章

  1. mysql clob blob,如何在MySQL中插入BLOB和CLOB文件?
  2. html_5_小作业2_世纪佳缘注册页面
  3. 黄褐斑的处理(转载)
  4. 【收藏】需求文档(PRD)终极撰写指南
  5. C语言开定时器做呼吸灯程序,简单的基于51单片机定时器上呼吸灯程序
  6. java 输出定位代码行_指定一个.java文件,输出其代码行数
  7. 【文献阅读】Perceptual Generative Adversarial Networks for Small Object Detection –CVPR-2017
  8. 设计模式--spring源码中使用策略模式(Strategy Pattern)
  9. Linux企业级项目实践之网络爬虫(27)——多路IO复用
  10. hadoop入门学习--WordCount
  11. linux c获取进程状态,Linux C 获取进程的退出值
  12. IP网络摄像头实现远程监控、直播的思路
  13. 基本农田卫星地图查询_谷歌地图打不开?试试这个替代网站,街景功能很好用!...
  14. pure-ftpd 搭建 FTP 服务器
  15. PS制作华丽的紫色立体字
  16. DOS批处理简明高级教程
  17. 90% 的前端都会使用 ES6 来简化代码,你都用过哪些?
  18. python接入excel_Excel 借助 Python 连接 WorkBench,实现 Excel 输入参数返回结果
  19. Java基础 DAY15
  20. 【TUXEDO】Linux下Tuxedo安装教程

热门文章

  1. JQuery 补充
  2. 学习笔记 第六周 第一篇
  3. Ubuntu下部署SVN+SVNManager
  4. 看看MySQL几种主流备份方案的优缺点
  5. 亚马逊ec2服务器上无法使用sudo执行npm命令的解决办法
  6. flask—wtforms
  7. 学习HashMap的笔记
  8. HUD-1559 最大子矩阵,dp模拟
  9. ps图层组快捷键 一次打开或关闭所有的顶级图层组
  10. GridView中 选中checkbox,在上下页 保存选中的值