一、隐式类型转换

系统自动进行,不需要程序开发人员介入。

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总结:

  1. 编译器隐式执行的任何类型转换都可以由static_cast完成

  2. 当一个较大的算术类型赋值给较小的类型时,可以用static_cast进行强制转换。

  3. 可以将void*指针转换为某一类型的指针

  4. 可以将基类指针转换为派生类指针

#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总结

  1. 用来移除对象的常量性(cast away the constness)

  2. const_cast一般用于指针或者引用

  3. 使用const_cast去除const限定的目的不是为了修改它的内容

  4. 使用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等相关推荐

  1. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast

    文章目录 前言 数据类型自动转换 C语言中的强制类型转换 C++中的强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast 强转关键字的 ...

  2. 显式强制类型转换static_cast, dynamic_cast, const_cast, reinterpret_cast

    显式强制类型转换(cast)包括以下操作符: static_cast,  dynamic_cast, const_cast, reinterpret_cast,对各种显式类型转换解释: static_ ...

  3. C++类型转换(static_cast,dynamic_cast,const_cast和reinterpret_cast)

    一.概述 类型转换(cast)是将一种数据类型转换成另一种数据类型.例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型(即 隐式转换 ).转换是非常有用的,但是它也会带来一 ...

  4. static_cast, dynamic_cast, const_cast,reinterpret_cast探讨

    http://www.cnblogs.com/chio/archive/2007/07/18/822389.html 首先回顾一下C++类型转换: C++类型转换分为:隐式类型转换和显式类型转换 第1 ...

  5. 类型转换操作符:static_cast, dynamic_cast, const_cast, reinterpret_cast.

    呵呵,今天来好好看看着几个转换操作符的用法.以前老是看着眼熟,但是用着手生.今天决定搞定这些个东西. 在C语言中类型转换有几种方式: 1.      (expression). 在表达式外边加括号,由 ...

  6. C++ 11 深度学习(五)类型转换:static_cast dynamic_cast const_cast reinterpret_cast

    四种cast 通用形式:强制类型转换名<type>(express) @强制类型转换名,以上四种  :@type:想要转成成的目标类型 : @express,需要转换的目标 static_ ...

  7. c++类型转换:static_cast, dynamic_cast,const_cast和reinterpret_cast

    static_cast 用法:static_cast < type-id > ( expression ) 说明:该运算符把expression转换为type-id类型,但没有运行时类型检 ...

  8. C++ static_cast dynamic_cast const_cast reinterpret_cast使用总结

    因为原来C风格的暴力万能类型转换容易导致运行时出错,所以要引入分类更清晰提前发现错误的转换语法. 对象的类型转换包含了对象的引用或指针. 1.static_cast是编译器默认选项,该运算符把expr ...

  9. When should static_cast, dynamic_cast and reinterpret_cast be used?

    这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C++里面的这几种类型转换操 ...

最新文章

  1. AOP原理-创建AOP代理--AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用
  2. 第一章 DevOps概述
  3. ngix 创建新的网站
  4. java previous_java – 在枚举类型上实现`next`和`previous`的最好方法是什么?
  5. tomcat 请求超时_高并发环境下如何优化Tomcat性能?看完我懂了!
  6. OpenShift 4 Hands-on Lab (13) 使用持久化存储
  7. 嵌入式系统——指令平均时钟数和运算速度MIPS计算
  8. 内核调试神器SystemTap — 简介与使用(一)
  9. 计算机的大管家教学反思,四年级计算机 第一课 计算机的“大管家”—— Windows XP.doc...
  10. 微软解决Office兼容性问题 补丁包 转帖之www.it.com.cn
  11. jflash添加芯片_工欲善其事,必先利其器:动手给JLink添加官方不支持的芯片
  12. PHP反序列化-__wakeup()方法漏洞(CVE-2016-7124)
  13. Centos 6.6安装chrome 谷歌浏览器
  14. Windows下如何对声卡音频输出进行录音
  15. C语言初学: 厘米换算英尺英寸
  16. C语言实现逆波兰表达式计算函数(含浮点型、整型混合运算)
  17. SpringAop篇 (1) AOP 基础之动态代理的实现
  18. python输入一个字符一个数字_Python程序输入一个字符串并查找字母和数字的总数...
  19. 越是见过世面的人,欲望越少
  20. 广告系统架构:要啥自行车!

热门文章

  1. 多年JAVA 基础总结
  2. Windows7下搭建Eclipse+Python开发环境
  3. ViewDragHelper详解
  4. hadoop JOB的性能优化实践
  5. 2018-2019-2 网络对抗技术 20165322 Exp8 Web基础
  6. 虚拟网络VDC与VPC
  7. 2018年全国多校算法寒假训练营练习比赛(第四场)F:Call to your teacher
  8. Struts2 Result 类型和对应的用法详解 2
  9. Hadoop平台搭建
  10. [Flex] ButtonBar系列——垂直布局