类型转换static_cast,dynamic_cast,const_cast,reinterpret_cast等
一、隐式类型转换
系统自动进行,不需要程序开发人员介入。
int m = 3 +45.6; //把小数部分截掉,也属于隐式类型转换的一种行为。
doublen = 3 +45.6;
二、显示类型转换(强制类型转换)
int k = 5 % 3.2; // 语法错
int k = 5 %(int)3.2; // OK,C语言风格的强制类型转换
int k = 5 % int(3.2); // 函数风格的强制类型转换(C语言风格的强制类型转换)
c++强制类型转换分为4中:我们现在写程序应该使用c++风格的强制类型转换。
这4种强制类型转换,分别用于不同的目的,每一个都有一个不同的名字。提供4中类的目的:提供更丰富的含义和功能,更好的类型检查机制,方便代码的熟悉和维护
a)static_cast
b)dynamic_cast
c)const_cast
d)reinterpret_cast
这四个强制类型转换都被称呼为“命名的强制类型转换”
通用形式
强制类型转换名<type>(express)
强制类型转换名是上边a,b,c,d四个名字之一
type:换换的目标类型
express:你要转换的值
2.1static_cast
static_cast:静态转换,大家就理解成“正常转换”,编译的时候就会进行类型转换的检查
代码中要保证转换的安全性和正确性,static_cast含义跟c语言中的强制类型转换这种差不多
c风格的强制类型转换,以及编译器能够进行的隐式类型转换,都可以用static_cast类显示完成
可用于:
a)相关类型转换,比如整形和实型之间的转换:
double f = 100.34f;
int i = (int)f; // c风格的
int i2 = static<int>(f) // c++风格的类型转换
b)子类转成父类类型(继承关系),也能用这个static_cast转
class A {};
class B : public A {};B b
A a = static_cast<A>(b); // 把子类转成父类的对象
c)void*与其他类型指针之间的转换,void*:无类型指针:可以指向任意类型指针(万能指针)
int i = 10;
int *p = &i;
void *q = static_cast<void *>(p); // int *转成void *,或者 void* q = p;
int *db = static_cast<int *>(q); // 需要使用static_cast才可以将void* 转为 int *
不可用于:
a)一般不能用于指针类型之间的转换比如int*转double*,float*转double*等。
d.static_cast总结:
编译器隐式执行的任何类型转换都可以由static_cast完成
当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。
可以将void*指针转换为某一类型的指针
可以将基类指针转换为派生类指针
#include <iostream>
using namespace std;class Base {
};class Derived :public Base {
};int main() {Base* base = new Derived;Derived* derive = static_cast<Derived*>(base);//Derived* derive = dynamic_cast<Derived*>(base); // 错误的,原因:因为Base没有虚函数
}
2.2dynamic_cast
主要应用运行时类型识别的检查。主要用来父类型和子类型之间转换(父类型指针指向子类型对象,然后用dynamic_cast把父指针类型往子指针类型转)
2.3const_cast
a)去除指针或者引用的const属性。该转换能够将const性质转换掉。
编译时进行类型检查
const int ai = 90;
int ai2 = const_cast<int>(ai); // ai不是指针也不是引用不能转
const int *pai = &ai;
int *pai2 = const_cast<int *>(pai); // 语法正确
*pai2 = 120; // 这种写值行为是属于一种未定义行为。大家不要这么干
cout << ai << endl;
cout << *pai << endl;// c风格强制类型转换
const int ai = 90;
int *pai = (int*)&ai;
*pai = 120; // 未定义行为
cout << ai << endl;
cout << *pai << endl;
#include <iostream>using namespace std;void func(int& val) {cout << "func: " << val << endl;
}//const_cast 用来移除对象的常量性
//const_cast一般用来用于指针或者引用
//const_cast去除常量性,不是为了修改他指定的内容
//const_cast去除常量性,为了函数能接受实参int main() {const int val = 100;//int n = const_cast<int>(val);//const_cast一般用于指针或者引用//int* p = &val;int* p = const_cast<int*>(&val);*p = 200;cout << val << endl; // val 还是 100, 改变临时对象值cout << "addr p: " << p << endl;cout << "addr val: " << &val << endl;const int val2 = 200;//int& refval2 = val2; int& refval2 = const_cast<int&>(val2);refval2 = 300;cout << "val2: " << val2 << endl; // 改变临时对象值//func(val2);func(const_cast<int&>(val2));return 0;
}
b)const_cast总结
用来移除对象的常量性(cast away the constness)
const_cast一般用于指针或者引用
使用const_cast去除const限定的目的不是为了修改它的内容
使用const_cast去除const限定,通常是为了函数能够接受这个实际参数
2.4reinterpret_cast
reinterpret:重新解释。(将操作系统内容解释为另一种不同的类型【能把操作数的类型都转了】)
处理无关类型的转换。也就是两个转换类型之间没有什么关系。就等于可以乱转,自由转。
常用于如下两种转换:
a)将一个整型(地址)转换成指针,一种类型指针转换成另一种类型指针,按照转换后的内容重新解释内存中的内容;
b)也可以从一个指针类型转换成一个整型
int i = 10;
int *pi = &i;
int *p2 = reinterpret_cast<int *>(&i);
char *pc = reinterpret_cast<char *>(pi); // 任意指针类型之间的转换int i = 10;
int *pi = &i;
void *pvoid = reinterpret_cast<void *>(&i);
int *pi2 = reinterpret_cast<int *>(pvoid);
被认为是危险的类型转换,随便转,怎么搞都行,编译器都不报错
int iv1 = 100;
long long lv1 = 8898899400; // 8 字节的 十六进制: 2 126A 6DC8
int*piv1 = (int*)iv1; // c语言风格
int *piv2 = reinterpret_cast<int*>(iv1);
piv2 = reinterpret_cast<int *>(lv1); // 整型转指针
long long ne = reinterpret_cast<long long>(piv2); // 指针转整型
c.reinterpret_cast总结
通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。
三.总结
(1)强制类型转换,不建议使用。强制类型转换能够抑制编译器报错
(2)学习目的:认识这些类型转换符,方便大家阅读别人代码。
(3)资料说:reinterpret_cast危险。使用const_cast意味着设计缺陷。
(4)如果实在需要使用类型转换,不要再使用c语言风格的类型转换了,而用c++风格的类型转换
(5)一般static_cast和reinterpret_cast就能够很好的取代c语言风格的类型转换
类型转换static_cast,dynamic_cast,const_cast,reinterpret_cast等相关推荐
- C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast
文章目录 前言 数据类型自动转换 C语言中的强制类型转换 C++中的强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast 强转关键字的 ...
- 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast
显式强制类型转换(cast)包括以下操作符: static_cast, dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...
- C++类型转换(static_cast,dynamic_cast,const_cast和reinterpret_cast)
一.概述 类型转换(cast)是将一种数据类型转换成另一种数据类型.例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型(即 隐式转换 ).转换是非常有用的,但是它也会带来一 ...
- static_cast, dynamic_cast, const_cast,reinterpret_cast探讨
http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...
- 类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast.
呵呵,今天来好好看看着几个转换操作符的用法.以前老是看着眼熟,但是用着手生.今天决定搞定这些个东西. 在C语言中类型转换有几种方式: 1. (expression). 在表达式外边加括号,由 ...
- C++ 11 深度学习(五)类型转换:static_cast dynamic_cast const_cast reinterpret_cast
四种cast 通用形式:强制类型转换名<type>(express) @强制类型转换名,以上四种 :@type:想要转成成的目标类型 : @express,需要转换的目标 static_ ...
- c++类型转换:static_cast, dynamic_cast,const_cast和reinterpret_cast
static_cast 用法:static_cast < type-id > ( expression ) 说明:该运算符把expression转换为type-id类型,但没有运行时类型检 ...
- C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结
因为原来C风格的暴力万能类型转换容易导致运行时出错,所以要引入分类更清晰提前发现错误的转换语法. 对象的类型转换包含了对象的引用或指针. 1.static_cast是编译器默认选项,该运算符把expr ...
- When should static_cast, dynamic_cast and reinterpret_cast be used?
这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C++里面的这几种类型转换操 ...
最新文章
- AOP原理-创建AOP代理--AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用
- 第一章 DevOps概述
- ngix 创建新的网站
- java previous_java – 在枚举类型上实现`next`和`previous`的最好方法是什么?
- tomcat 请求超时_高并发环境下如何优化Tomcat性能?看完我懂了!
- OpenShift 4 Hands-on Lab (13) 使用持久化存储
- 嵌入式系统——指令平均时钟数和运算速度MIPS计算
- 内核调试神器SystemTap — 简介与使用(一)
- 计算机的大管家教学反思,四年级计算机 第一课 计算机的“大管家”—— Windows XP.doc...
- 微软解决Office兼容性问题 补丁包 转帖之www.it.com.cn
- jflash添加芯片_工欲善其事,必先利其器:动手给JLink添加官方不支持的芯片
- PHP反序列化-__wakeup()方法漏洞(CVE-2016-7124)
- Centos 6.6安装chrome 谷歌浏览器
- Windows下如何对声卡音频输出进行录音
- C语言初学: 厘米换算英尺英寸
- C语言实现逆波兰表达式计算函数(含浮点型、整型混合运算)
- SpringAop篇 (1) AOP 基础之动态代理的实现
- python输入一个字符一个数字_Python程序输入一个字符串并查找字母和数字的总数...
- 越是见过世面的人,欲望越少
- 广告系统架构:要啥自行车!