C++类型转换的注意事项
1、如果两个类型可以相互转换,就说他们是关联的。
2、隐式转换是指,由编译器自行转换,而不需要程序员介入的转换。
3、以下情况,编译器会发生隐式转换:
1)在大多数表达式中,比int类型小的整型值会被提升为较大的整型值。
2)在条件语句中,非布尔类型会被转换成布尔类型。
3)初始化过程中,初始值的类型转换成变量的类型时,赋值运算符的右侧运算对象的类型会被转换成左侧 运算对象的类型。
4)如果算术运算符或关系运算符的运算对象有多种类型,需要转换成同一种类型。
5)函数调用,也会发生类型转换。
4、算术转换的规则,就是运算符的运算对象不管是什么类型,都会被转换成最宽的那个类型。例如,如果有一个运算对象的类型是long double,那么不管另一个运算的对象的类型是什么,都会被转换成long double。
5、整型提升,就是把较小的整型数类型转换成较大的整型数类型,对于比int类型小的整数类型,都会被提升为int类型,否则,提升为unsigned int。而较大的char类型会被提升为int、unsigned int、long、unsigned long、long long和unsigned long long中的最小的一种类型。
6、其他的隐式转换:1)数组转换成指针,大多数情况下,数组会自动转换成指针类型,但是如果是decltype关键字的参数,取地址运算符,sizeof运算符及typeid运算符的运算对象时,不会转换,并且如果使用一个引用去初始化数组,也不会转换。
2)指针的转换,常量整数值0、字面值nullptr都能转换成任意指针类型,指向任意非常量对象都能转换为void *类型,指向任意对象的指针都能转换为const void*类型。
a)指针还能转换成bool类型,如果指针的值为0,则转换结果为false,否则为true;
b) 转换成常量,允许一个指向非常量的指针或者引用转换成一个指向常量的指针,不存在相反的转换。
3)类类型的定义的转换,类类型能定义由编译器自动执行的转换,不过编译器每次只能执行一种类类型的转换。
7、 一般情况下使用强制类型转换是非常危险的。
8、新标准下,命名的强制转换形式:cast-name<type>(expression); type是要转换成的目标类型,而expression是要转换的值。若type是引用类型,则其结果是左值。其中cast-name是static_cast、dynamic_cast、const_cast和reinterpret_cast中的一种。
9、dynamic_cast支持运行时识别。任何具有明确定义的类型的转换,只要不包含底层Const,都可以使用static_cast。并且前面说到不能访问void*指针,但是通过static_cast强制转换可以将其转换成普通指针。注意,强制转换前后指针的值保持不变,并且转换前后指针所指的类型必须保持一致,否则会出现未定义的行为。
10、const_cast只能改变运算对象底层const,一般用于转换常量对象为非常量对象,也就是有去掉const的性质。
11、reinterpret_cast为运算对象的位模式上提供较低层次的重新解释。其本质上依赖于机器,也就是说要对涉及类型和编译器实现类型转换的过程都非常的了解。
12、《C++ primer fifth》建议我们避免使用强制类型转换,因为强制类型转换干扰了编译器正常的类型检查,在实际的编程中,应该对强制类型转换的类型做个记录,以便于发生错误时查找。
13、早期版本的C++,有两种强制类型转换,一种是type(expr),一种是(type)expr,前者是函数形式的强制类型转换,后者是C语言风格的强制类型转换。
14、可以使用static_cast和const_cast替换旧版本的强制转换类型,若合法,则其行为与对应的命名转换一致。若替换后,不合法,则旧式强制类型转换与reinterpret_cast类似的功能。
15、旧式的类型转换与命名的强制类型转换的区别在于,旧式类型转换的表现形式不那么清晰,一旦转换出现问题,很难追踪。
C++类型转换的注意事项的更多相关文章
- JAVA基本数据类型转换的注意事项
JAVA中基本数据类型: 类型: 字节: 范围: 默认值: byte 1 -128~127 0 short 2 -32768~32767 0 char 2 0~65535 '\u0000' int 4 ...
- 在Python中数据类型转换的注意事项
在学习Python的过程接触到了数据类型转化这一过程,在实践的过程中我发现了一个小问题,我们在平常的使用中要一定注意 在str型转换成int型的过程中,str内的内容必须是整数不然会报错 如图: 在转 ...
- C++:类型转换
5.3 类型转换 5.3.1 系统预定义类型间的转换 1. 隐式转换: 例如: int x=5,y; y=3.5+x; //系统会自动先将int型的5转换为double型的5. ...
- 【黑马JavaSE】1.1JavaSE、环境变量、CMD使用、常量、变量、数据类型转换(自动/强制)、ASCII码表、Unicode万国码表
文章目录 SUN公司,詹姆斯.劳瑟琳,Java祖师爷 Java语言开发环境搭建 把Java添加到环境变量的方法 命令行CMD里一些报的错误 命令控制行常用操作的代码展示 Notepad++.注释.标识 ...
- (转)C#调用非托管Win 32 DLL
转载学习收藏,原文地址http://www.cnblogs.com/mywebname/articles/2291876.html 背景 在项目过程中,有时候你需要调用非C#编写的DLL文件,尤其在使 ...
- C#图解教程 第二十五章 其他主题
其他主题 概述字符串使用 StringBuilder类把字符串解析为数据值关于可空类型的更多内容 为可空类型赋值使用空接合运算符使用可空用户自定义类型 Main 方法文档注释 插入文档注释使用其他XM ...
- Java基本类型与运算
问题及答案来源自<Java程序员面试笔试宝典>第四章 Java基础知识 4.4基本类型与运算 1.Java提供了哪些基本数据类型? Java一共提高了八种原始的数据类型:byte.shor ...
- Java面试题_第一阶段(static、final、面向对象、多线程、集合、String、同步、接口、GC、JVM)
1.1 简述static和final的用法? static:修饰属性,方法,代码块 (1)静态属性:也可叫类变量 类名.属性名 来访问 (共有的类变量与对象无关,只和类有关) 注意:类中的实例变量 ...
- Day04:继承的意义(下)
对象转型 向上造型 什么是向上造型? 子类对象赋给父类引用. 父类引用指向子类对象. 子类转成父类 默认进行(父类引用指向子类对象). 为什么需要向上造型? 子类对象可以放入父类类型的数组中. 父类数 ...
随机推荐
- 电脑用HDMI线分屏后,耳机或音箱没声音之完美解决!
现今,由于工作需要,很多人都偏爱给自己的电脑进行分屏,两个显示器同时连接在一台电脑上,并进行“扩展这些功能显示”,从而大大提高了工作积极性和工作效率.本人在进行分屏后遇到了耳机没有声音的问题,并进行了 ...
- 非递归遍历二叉树Java实现
2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...
- legend2---开发日志3(thinkphp的入口目录是public的体现是什么)
legend2---开发日志3(thinkphp的入口目录是public的体现是什么) 一.总结 一句话总结:需要深刻理解程序的入口和入口位置都在public目录这里,比如读写文件的初始目录都在这,获 ...
- RHEL 5 , 用安装CD作为YUM的Repository
官方文档写的非常好 14.5. Upgrading the System Off-line with ISO and Yum Create a target directory to mount yo ...
- 详解 Solidity 事件Event - 完全搞懂事件的使用
很多同学对Solidity 中的Event有疑问,这篇文章就来详细的看看Solidity 中Event到底有什么用? 写在前面 Solidity 是以太坊智能合约编程语言,阅读本文前,你应该对以太坊. ...
- apicloud 聊天输入框模块UIChatBox
点击链接查看详情 https://docs.apicloud.com/Client-API/UI-Layout/UIChatBox 模板中包括,聊天输入框,表情,发送图片,还有拍照,录音,其中也可以放 ...
- 【其他】【服务器】【4】删除Windows系统中不想要的服务
步骤: 1,开始菜单栏查找“服务”,打开后找到想要删除的服务 2,右键单击想要删除的服务,选择“属性”-“常规”-“服务名称”,记下服务名称(AA) 3,开始菜单栏输入“cmd”打开命令行窗口,输入s ...
- 【其他】【PL/SQL Developer】【1】解决PL/SQL Developer过期的情况
正文: 1,开始菜单,搜索regedit,回车打开(即日常搜索电脑安装的软件的地方,regedit就是注册表) 2,按HKEY_CURRENT_USER\Software\Allround Autom ...
- MySQL共享表空间概念
1.表空间概念 Innodb存储引擎可将所有数据存放于ibdata*的共享表空间,也可将每张表存放于独立的.ibd文件的独立表空间.共享表空间以及独立表空间都是针对数据的存储方式而言的. 共享表空间 ...
- 【LeetCode】Valid Parentheses合法括号
给定一个仅包含 '('.')'.'{'.'}'.'['.']'的字符串,确定输入的字符串是否合法. e.g. "()"."()[]{}"."[()]( ...