c和c++的强制类型转换
我们知道c语言中的类型转换只有一种,
TYPE b = (TYPE)a;
而在c++中按照不同作用的转换类型将其细分为三个显示类型转换符号static_cast, const_cast, reinterpret_cast,这种显示转换可以提供更丰富的含义和功能,更好的类型检查机制,方便代码的维护。
1.static_cast
- 主要用于相关类型之间的转换,如c的基本数据类型char,int,double等之间,以及基类和子类之间转换(没有dynamic_cast安全),可能会有字节转换,不可以转换不相关类型如int*和double*,以及没有继承关系的类指针
- void*与其他类型指针之间的转换
double bv = 100.0
int i = (int)bv; //c style, 0x64
int iv2 = static_cast<int>(bv); //0x64
int iv2 = reinterpret_cast<int>(bv); //error, double bv = 100.0;
double *pbv = &bv;
int *iv1 = (int*)pbv; //c style, right
int *iv2 = static_cast<int*>(pbv); //error: invalid static_cast from type `double*' to type `int*'
int *iv2 = reinterpret_cast<int*>(pbv); //right,
void *piv1 = (void*)pbv;
void *piv2 = static_cast<void*>(pbv);
int *piv3 = static_cast<int*>(piv2); //right
2.reinterpret_cast
- 转换的类型type必须是一个指针或引用,仅仅按照转换后的类型重新解释字节,并不会做字节转换
- 如果将非指针变量转换成指针,变量大小必须与指针大小相等。
- 移植性差
int lv = ;
long long llv =;
int *piv1 = (int*)lv; //c style, do’not check size
int *piv2 = reinterpret_cast<int*>(lv); //lv is treated as pointer
piv2 = reinterpret_cast<int*>(llv); // warning, different size
3.const_cast
去除指针或者引用的const或volatile属性
//c style
const char const_char = 'a';
char *pch = &const_char; //error: invalid conversion from `const char*' to `char*'
char *pch = (char*)&const_char; //right
*pch = 'c'; //c++style
const char const_char = 'a';
char chv = const_cast<char>(const_char); //error, invalid use of const_cast with type `char', which is not a pointer, reference, nor a pointer-to-data-member type
const char *pch = &const_char;
char *chv = const_cast<char*>(&const_char);//right
*chv=’c’;
总结:这三种与c对应的强制类型转换符号都是编译时确定的,RTTI的dynamic_cast和c没有关系,以后再专门介绍。
c和c++的强制类型转换的更多相关文章
- java中强制类型转换
在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- C++强制类型转换
C语言强制类型转换过于粗暴,任意类型之间都可以进行转换,编译很难判断其正确性; 难于定位,在源码中无法快速定位所有使用强制类型转换的语句. C++将强制类型转换分为4种不同的类型:static_cas ...
- java提高篇(十一)-----强制类型转换
在java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换. 在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需 ...
- JavaScript学习10 JS数据类型、强制类型转换和对象属性
JavaScript学习10 JS数据类型.强制类型转换和对象属性 JavaScript数据类型 JavaScript中有五种原始数据类型:Undefined.Null.Boolean.Number以 ...
- C++强制类型转换操作符 dynamic_cast
dynamic_cast是四个强制类型转换操作符中最特殊的一个,它支持运行时识别指针或引用. >>>>>>>>>>>编译器的RTTI设 ...
- C++强制类型转换操作符 const_cast
const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转 ...
- C++强制类型转换操作符 static_cast
static_cast是一个强制类型转换操作符.强制类型转换,也称为显式转换,C++中强制类型转换操作符有static_cast.dynamic_cast.const_cast.reinterpert ...
- Js里面的强制类型转换
js 和 PHP语言一样是弱类型语言.近期我也在看C语言,并没有传说中那么难,既是书中一再强调的指针部分,也没有那么夸张.至少是理论和语法理解起来不是很难.看起来凡是什么东西,不要总是被别人的话迷惑了 ...
- c语言强制类型转换
一.强制类型转换 printf("3/2+100.5=%f",3/2+100.5);//100.5错误表达 printf (" (float)3/(float)2 ...
- 数据类型/强制类型转换 和运算符---标识符规则/关键字 a++和++a区别
3.2关键字都是小写,TRUE FALSE NULL都不是Java关键字 3.3数据类型 变量相当于一个有名称的容器,该容器用于装各种不同类型的数据 Java类型分为2种 基本类型: 引用类型: 基本 ...
随机推荐
- 关于PHP中的 serialize () 和 unserialize () 的使用(即关于PHP中的值与已存储的表示的相互转换)
有时,我们会碰到这样的数据(字符串) a:3:{i:0;s:44:"/Uploads/images/2017-07-21/5971a9a08ad57.png";i:1;s:44:& ...
- FactoryBean的实现原理与作用
FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...
- java连接linux的三种方式(附执行命令)
# 本地调用使用JDK自带的RunTime类和Process类实现 public static void main(String[] args){ Process proc = RunTime.get ...
- AJAX上传文件到服务器
上传文件是常要处理的事情,使用ajaxFileUpload.js处理比较方便,这里的ajaxFileUpload.js文件修改过的, Html部分 <input type="file& ...
- chromium之message_pump_win之三
上一篇分析MessagePumpForUI,参考chromium之message_pump_win之二 MessagePumpForIO,同MessagePumpForUI,也是要实现三个函数 // ...
- java中实现多线程的几种方式(简单实现)
一.以下只是简单的实现多线程 1:继承Thread 2:实现 Runnable 3:实现callable 如果需要返回值使用callable,如果不需要返回最好使用runnable,因为继承只能单继承 ...
- Python基础知识--Slice(切片)和Comprehensions(生成式)
最近在Youtube的Python视频教程上学习Python相关的基础知识,视频由Corey Schafer制作,讲得十分简单明了,英文发音也比较清晰,几乎都能听懂,是一个不错的Python入门学习的 ...
- Spring Boot在反序列化过程中:jackson.databind.exc.InvalidDefinitionException cannot deserialize from Object value
错误场景 用Spring boot写了一个简单的RESTful API,在测试POST请求的时候,request body是一个符合对应实体类要求的json串,post的时候报错. 先贴一段error ...
- 02JavaScript用法
前言: 介绍一下javascript的最基础语法规范和用法. HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 ...
- HTML5新标签兼容——> <!--<if lt IE 9><!endif-->
第一种方法:(使用html5shiv) <!--[if lt IE9]> <script src="http://html5shiv.googlecode.com/svn/ ...