C++当中的几种强制类型转换

原创 2016年08月31日 14:50:32

在C++当中,我们不推荐继续使用C类型的强制转化,而是使用标准C++的类型转换符,标准C++中有四个类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。下面对它们一一进行介绍。

static_cast

只要是不包含底层的const,我们都可以使用static_cast,当需要一个较大的算数类型赋值给较小的类型的时候,这个时候static_cast非常有用。这个时候就相当于你告诉了编译器,我们知道并且不在乎精度的损失。
另外,static_cast还可以对void指针转换成想要的类型的指针。但是这里面我们需要确保转换后得到的类型就是指针所指的类型,如果类型不符合,会产生未定义的后果。

用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。
只是适用于可以实现隐式类型转化的相关类型。否则会出现错误。
用法:static_cast < type-id > ( expression )

const_cast

只改变常量属性。
常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。
可以称作为去掉常属性。

只有const_cast能改变表达式的常量属性,使用其他类型会出现编译器错误。同样,不能改变表达式的类型。
用法:const_cast < type-id > ( expression )

reinterpret_cast

用于将一种类型转换为另一种类型,只适用于不相关的类型,这种类型转换的权限很大。比如:它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。

因为它通常会为运算对象的位模式提供较低层次上的重新解释,所以权限大。

所以,带来的问题是它很危险。它本质上是依赖于机器,所以想要安全的使用它必须对相关类型和编译器实现转换的过程非常了解才行。

用法:reinpreter_cast (expression)

dynamic_cast

动态转化,用于将一个基类对象指针/引用转换为拍摄类对象指针/引用。

向上转型:子类对象指针->父类指针/引用(不需要转换)
向下转型:父类对象指针->子类指针/引用(用dynamic_cast转型是安全的)
1 . dynamic_cast只能用于含有虚函数的类
2 . dynamic_cast会先检查是否能转换成功,能成功则转换,不能则返回0。
用法:dynamic_cast < type-id > ( expression )

版权声明:本文为博主原创文章,未经博主允许不得转载。

c++四种强制类型转换

c++四种强制类型转换c++有四种类型的强制类型转换,所以c++不是类型安全的。分别为: static_cast,dynamic_cast,const_cast,reinterpret_cast为...
  • u013573047
  • u013573047
  • 2016年03月22日 11:58
  • 1442

c++中的4种类型转换

1.C++中有哪4个和类型转换相关的关键字?这些关键字都有什么特点?应该在哪些场合下使用.    C语言中的强制类型转换可以随意的转换我们想要的类型了,格式如下(类型) 变量名;    为...
  • xtzmm1215
  • xtzmm1215
  • 2015年06月12日 21:09
  • 2846

C++11

转自 https://zh.wikipedia.org/wiki/C%2B%2B11 C++11,先前被称作C++0x,即ISO/IEC 14882:2011,是目前的C++编程语言的正式标准...
  • arau_sh
  • arau_sh
  • 2013年05月08日 21:20
  • 1249

C++之强制类型转换原理

不管是哪种编程语言,都会涉及到数据类型转换。强制类型转换是将操作数的类型转换成所需要的类型。强制类型转换到底是如何实现的?请先看下面一个简单数据类型的转换: 一、简单数据类型的强制类型转换 cha...
  • sjm19901003
  • sjm19901003
  • 2015年03月30日 04:25
  • 2014

C++_4种强制类型转换

C++的四种强制类型转换为:static_cast、const_cast、reinterpret_cast和dynamic_cast 类型转换的一般形式:cast-name(expression); ...
  • u010275850
  • u010275850
  • 2015年10月28日 19:13
  • 2655

C++中的类型转换之隐式与显示转换

在编程中,类型转换在所难免,在此我将介绍一下C++中常用的隐式转换和强制类型转换。 关于隐式转换: 在C++中,某些类型之间存在相关的依赖关系,若两种类型相关,则可以再需要某种类型的操作数位置上,使用...
  • vmezr
  • vmezr
  • 2014年03月05日 22:40
  • 2816

【C++】强制类型转换运算符的重载

#include #include using namespace std; class MyCin {     bool bStop;     public:         My...
  • u012261044
  • u012261044
  • 2014年06月07日 10:28
  • 1017

C++:类的自动转换和强制类型转换

C++:类的自动转换和强制类型转换标签(空格分隔): c++ 作者:陈小默C类的自动转换和强制类型转换 C如何处理内置类型转换 构造函数的自动转换 自动转换的条件 自动类型转换的流程 使用expli...
  • qq_32583189
  • qq_32583189
  • 2016年09月06日 13:05
  • 2522

Java基础:第四十讲 向上转型和强制类型转换

  • JavaEETeacher
  • JavaEETeacher
  • 2010年02月22日 12:31
  • 4084
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++当中的几种强制类型转换
举报原因:
原因补充:

(最多只允许输入30个字)