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:继承的意义(下)
对象转型 向上造型 什么是向上造型? 子类对象赋给父类引用. 父类引用指向子类对象. 子类转成父类 默认进行(父类引用指向子类对象). 为什么需要向上造型? 子类对象可以放入父类类型的数组中. 父类数 ...
随机推荐
- Asp.net core 学习笔记 ( Azure key-vault )
参考 : https://docs.microsoft.com/en-us/aspnet/core/security/key-vault-configuration?view=aspnetcore-2 ...
- Java 动态图片压缩
今天收到领导的一个任务,说是图片太大导致服务器那边无法解析,要求图片大小大于102*126就压缩大小为102*126.同时文件是以Base64字符串的形式传过来的.具体压缩方法如下: /** * 图片 ...
- OSPF - 3,OSPF区域和LSA
1,四种末端区域骨干区域和标准区域:1,2,3,4,5,包含5类LSA,为了减少某些普通区域的LSA(主要就是4类和5类,有时做绝到连3类也不要了),引入了末梢区域.同时为了确保数据能出去,一般ABR ...
- 使用VisualStudio进行脚本|样式文件压缩
在vs的Optimization中有个Bundle是专门用来压缩样式和脚本文件 .他有两个继承:StyleBundle.ScriptBundle,从名字上就可看出,StyleBundle专门压缩样式文 ...
- android------Eclipse Memory Analyzer (MAT)
简单介绍 MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速.功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗. 使用内 ...
- linux网络配置命令(二)——ip
ip命令 查看/设置路由.设备.路由策略和渠道信息 格式 ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT := { link | addr | addr ...
- kohana导入和导出
一.导入 ini_set('memory_limit', '512M'); require_once(Kohana::find_file('vendor', 'PHPExcel/PHPExcel/IO ...
- Git将本地项目上传到GitHub
本文转载于:https://segmentfault.com/a/1190000011909294 https://www.cnblogs.com/cxk1995/p/5800196.html 我们使 ...
- sqlite3 删除数据
cx = sqlite3.connect("c:/数据库地址") # 打开数据库cu = cx.cursor()# delete the rowcu.execute("d ...
- MongoDB\BSON\UTCDateTime::toDateTime
示例# 1 MongoDB \ BSON \ UTCDatetime:toDateTime()例子 <?php $utcdatetime = new MongoDB\BSON\UTCDateTi ...