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种 基本类型: 引用类型: 基本 ...
随机推荐
- web.xml中Filter的作用
Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码.做一些业务逻辑判断等.其工作原理是,只要你在web.xml文件配置好要 ...
- java连接数据库增删改查公共方法
package dao; import java.io.IOException; import java.sql.CallableStatement; import java.sql.Connecti ...
- STM32之FSMC
FSMC全称“静态存储器控制器”. 使用FSMC控制器后,可以把FSMC提供的FSMC_A[25:0]作为地址线,而把FSMC提供的FSMC_D[15:0]作为数据总线. (1)当存储数据设为8位时, ...
- 《DOM编程艺术》读书笔记<概述>
作为一名前端开发工程师,学习的过程中总少不了各种各样的书籍,作为新手如何在众多书籍中选到适合自己的呢,我们今天先来谈谈<DOM编程艺术>这本书. 其实呢大部分书都是好书,就像LOL中大部分 ...
- 复习宝典之SpringMVC
查看更多宝典,请点击<金三银四,你的专属面试宝典> 第七章:SpringMVC MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(co ...
- Oracle登录失败:监听程序当前无法识别连接描述符中请求的服务
Oracle11g下载地址:https://pan.baidu.com/s/1p3RwLUTAl1Ys4yXmXJ3OVQ 安装步骤视频链接:https://pan.baidu.com/s/1c0FC ...
- 让 shell(bash) 命令行显示当前 git 的分支名称
早上测试脚本的时候,偶然在这篇文章<Git – setting up a remote repository and doing an initial push>看到一个关于 git 的好 ...
- 【Linux】Linux 的慢动作基础
了解一下刀片服务器: 刀片服务器是指在高标准度的机架式机箱内插装多个卡式的服务器单元,是一种实现HAHD的低成本服务器平台,其中每一片刀片实际上就是一块系统主板. Linux: Linux操作系统构成 ...
- 转载自鸿燕藏锋-ETL讲解(很详细!!!)
ETL讲解(很详细!!!) ETL讲解(很详细!!!) ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供 ...
- Python学习手册之字符类和元字符深入
在上一篇文章中,我们介绍了 Python 的正则表达式和元字符,现在我们介绍 Python 的字符类和对元字符进行深入讲解.查看上一篇文章请点击:https://www.cnblogs.com/dus ...