类型转换:static_cast、reinterpret_cast等
一、隐式类型转换
系统自动进行,不需要程序开发人员介入。
int m = 3 + 45.6;// 48 把小数部分截掉,也属于隐式类型转换的一部分
double b = 3 + 45.6; // 48.6
二、显示类型转换(强制类型转换)
int key = % 3.2; // 语法错误
int k = % (int)3.2; // 强制转换为3,C语言风格的类型转换
int k1 = % int(3.2); // 函数风格的强制类型转换
C++类型强制类型转换分为4种:
这四种强制类型转换被称为命名的强制类型转换;目的是为了提供更加丰富的含义和功能,更好的类型检查机制。
通用形式:强制类型转换名<type>(express)
(1)static_cast:静态转换,编译的时候就会进行类型转换的检查
代码中要保证类型转换的安全性与正确性,含义与C语言的强制类型转换意义差不多。C风格的强制类型转换以及编译器能够进行的隐式类型转换,都可以用static_cast类型显示完成。
可用于:
(a)相关类型转换,比如整型和实型之间的转换
double f = 100.43f;
int i = (int)f; // C风格的
int i2 = static_cast<int>(f); // C++风格的强制类型转换 显示
(b)子类转换为父类的时候(继承关系),也可以用static_cast
calss A{};
class B : public A{}; // 公有继承
B b;
A a = static_cast<A>(b);// 将子类转换为父类
(c)void *与其他的类型指针之间的转换,void *无类型指针,可以指向任何类型的指针(万能指针)
int i = ;
int *p = &i;
void *q = static_cast<void *>(p); // int *转换为void *
int *dq = static_cast<int *>(q); // 将void *转换回int *
一般不能用于:
(a)一般不能用于指针类型之间的转换比如int * 转double *,float *转 double*等等
double f = 100.0f;
double *pf = &f;
// int *if = static_cast<int *>(pf); // 不可以
// float *if = static_cast< float *>(pf); // 不可以
(2)dynamic_cast
主要应用于运行时类型识别与检查。主要用来父类型和子类型之间转换用(父类型指针指向子类型对象,然后用dynamic_cast把父指针类型转换为子指针类型)
(3)const_cast
去除指针或引用的const属性,该指针能将const性质转换掉,编译时类型转换。
cons tint ai = ;
//int ai2 = const_cast<int>(ai); // ai不是指针或引用,不能转换
const int *pai = &ai;
const int *pai2 = const_cast<int *>(pai); // 语法正确
*pai2 = ; // 这种写值行为,属于一种未定义行为,尽量不要这么写
cout <<ai << endl; //
cout << *pai << endl; //
cons tint ai = ;
int *pai2 = (int *)&ai; // 语法正确
*pai2 = ; // 这种写值行为,属于一种未定义行为,尽量不要这么写
cout << ai << endl; //
cout << *pai2 << endl; //
(4)reinterpret_cast
编译的时候就会进行类型转换的检查,翻译,重新解释
将操作数内容解释为另一种不同的类型。
处理无关系的转换,也就是两个类型转换之间没有什么关系;就等于什么都可以转换。
(a)将一个整型(地址)转换为指针,一种类型指针转换为另一种类指针,按照转换后的内容重新解释内存中的内容。
(b)也可以从一个指针转换为整型
int i = ;
int *p = &i;
int *p2 = reinterpret_cast<int *>(&i);
char *pc = reineterpret_cast<char *>(pi);
int I = ;
int *p = &I;
void *pvoid = reinterpret_cast<void *>(p);
int *p1 = reinterpret_cast<int *>(pvoid);
// 被认为是危险的类型转换
int iv1 = ;
long long lv1 = ;// 88亿 十六字节:2 126A 6DC8
int *piv1 = (int *)iv1; // C语言风格 //0X00000064
int *piv2 = reinterpret_cast<int *>(iv1);//0X00000064
piv2 = reinterpret_cast<int *>(lv1); // OX126A 6DC8 把前面的2丢了,因为piv2是4字节的
long long ne = reinterpret_cast<long long>(piv2); // 指针类型转long long
// 308964808 十六进制:126A 6DC8
三、总结
(1)强制类型转换,不建议使用;强制类型转换能够抑制编译器报错。
(2)了解类型转换符,方便阅读别人代码。
类型转换:static_cast、reinterpret_cast等的更多相关文章
- C++雾中风景11:厘清C++类型转换(static_cast,dynamic_cast,reinterpret_cast,const_cast)
C++是一门弱类型的语言,提供了许多复杂和灵巧类型转换的方式.笔者之前写的Python与Go都是强类型的语言,对这种弱类型的设计实在是接受无力啊~~ ( 生活所迫,工作还得写C++啊~~)C++语言提 ...
- C++里的强制类型转换符reinterpret_cast、static_cast 、dynamic_cast、const_cast 区别
C 风格(C-style)强制转型如下: (T) exdivssion // cast exdivssion to be of type T 函数风格(Function-style)强制转型使用这样的 ...
- C++类型转化:static_cast,reinterpret_cast,dynamic_cast,const_cast
类型转换名称和语法 C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. ...
- c++强制类型转换(static_cast,const_cast,dynamic_cast,reinterpret_cast)
static_cast <typeid>(exdlvssion) static_cast 很像 C 语言中的旧式类型转换.它能进行基础类型之间的转换,也能将带有可被单参调用的构造函数或用户 ...
- [C/C++]_[0基础]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和差别]
场景: 1. C++的对象差别于C的原因是他们能够有继承关系, 方法有重载, 覆盖关系等, 他们的对象内存数据结构因此也比較复杂. 2. 非常多情况下我们须要一个父类来存储子类的指针对象进行通用方法的 ...
- 【C++】 四种强制类型转换(static_cast 与 dynamic_cast 的区别!)
强制类型转换 1. static_cast 2. dynamic_cast 3. const_cast 4. reinterpret_cast 5. 为什么要需要四种类型转换? 1. static_c ...
- const_cast, dynamic_cast, static_cast,reinterpret_cast
一.const_cast:用于移除const数据,目标数据类型必须与原类型相同 二.dynamic_cast:用于在两个不同类型之间进行强制转换并且在执行运行时检查它.保证它的合法性,如果在两个互相矛 ...
- Directx11学习笔记【十四】 使用最新的Effect框架和SDK
由于之前一直在看directx11龙书学习,因此sdk一直用的Microsoft DirectX SDK (June 2010) 版本,最近在stackoverflow上问dx11相关问题时,一直被大 ...
- static_cast,const_cast,dynamic_cast,reinterpret_cast
除非必要,尽量不要对变量进行强制转换.这是因为强制转换是存在风险的,但实际上在某种情况下,转型是必需的. 旧式C转型方式为(type)expression,即由一对小括号加上一个对象名称组成,而这种语 ...
- 【转】static_cast和reinterpret_cast
static_cast和reinterpret_cast揭秘 收藏 本文讨论static_cast<> 和 reinterpret_cast<>. reinterpret_ca ...
随机推荐
- SNAT和DNAT的区别
SNAT: Source Network Address Translation,是修改网络包源ip地址的.DNAT: Destination Network Address Translation, ...
- Photoshop中的高斯模糊、高反差保留和Halcon中的rft频域分析研究
在Halcon的rft变换中,我们经常可以看到这样的算子组合: rft_generic (Image, ImageFFT2, 'to_freq', 'none', 'complex', Width) ...
- Python打开文件open()的注意事项
刚刚用open(fileName)来打开txt格式的文件,总是出现错误,总是找不到文件读取的内容,后来才发现是open()在使用过程中自动关闭了.这里介绍另种方法解决这个问题. 第一种方法. with ...
- 移动直播app怎么做
今年移动直播行业的兴起,诞生了一大批网红,甚至明星也开始直播了,因此不得不跟上时代的步伐,教你从零开始搭建一个完整的iOS直播app,希望能帮助到更多的人更快的了解直播. 了解直播 1 热门直播产品: ...
- 购买阿里云的云服务器时选择镜像centos时应该选择哪个版本
购买阿里云的云服务器时选择镜像centos时应该选择哪个版本 方法/步骤首先,我们要清楚的便是每个系统之间的差别,以及在阿里云上的差别:1. Windows1.1) 系统内含正版激活.1.2) 适合于 ...
- .NET平台机器学习资源汇总,有你想要的么?(转)
出处:http://www.cnblogs.com/asxinyu/p/4422050.html 阅读目录 1.开源综合类 2.开源.NET平台非综合类 3.其他资源与技术博客 4.我的100篇博客之 ...
- Mysql 关于not exists一例
场景: 业务上需要做一个查询,因为是Web及时响应,所以对响应时间有要求,原业务场景是需要从无库存订单中剔除绑定闲置库存,因单条sql查询实现复杂,故考虑用差集方式: select a.col1, a ...
- UVa 1614 Hell on the Markets (贪心+推理)
题意:给定一个长度为 n 的序列,满足 1 <= ai <= i,要求确实每一个的符号,使得它们和为0. 析:首先这一个贪心的题目,再首先不是我想出来的,是我猜的,但并不知道为什么,然后在 ...
- ORA-12541: TNS: 无监听程序、监听程序当前无法识别连接描述符中请求的服务
%ORACLE_HOME%\product\11.2.0\dbhome_1\NETWORK\ADMIN 这个文件夹下有SAMPLE 里面有详细配置说明 有3个文件, listener.ora sqln ...
- 团队-Forward-团队一阶段互评
学号:2015035107105得分:4原因:代码不规范,有一些错误,需要我们的帮助. 学号:2015035107109得分:7原因:与队员沟通少,代码衔接有问题. 学号:2015035107113得 ...