static_cast和dynamic_cast等类型转换

原创 2018年04月16日 10:32:10

static_cast



用法:static_cast < type-id > (expression )



说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。


它主要有如下几种用法:

·        用于类层次结构中基类和子类之间指针或引用的转换。进行上行转换(把子类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成子类指针或引用)时,由于没有动态类型检查,所以是不安全的。[a1] 

·        用于基本数据类型之间的转换,如把int转换成charint转换成enum。这种转换的安全性也要开发人员来保证。

·        void指针转换成目标类型的指针(不安全!!)

·        把任何类型的表达式转换成void类型。

注意:static_cast不能转换掉expressionconstvolitale、或者__unaligned属性。

 

static_cast:直接继承,指针不变;在虚继承时,会改变指针且虚继承不允许基类转子类。

虚继承是为了解决菱形继承这种多继承时函数重名的问题。

 

dynamic_cast



用法:dynamic_cast < type-id > (expression )

 

说明:该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。

 

基类转子类时(下行时),基类需要有虚函数,否则就会报编译错误。

dynamic_cast:直接继承,指针不变;在虚继承时,会改变指针且虚继承不允许基类转子类。

 

reinpreter_cast



用法:reinpreter_cast<type-id> (expression)



说明:type-id必须是一个指针、引用、算术类型、函数指针或者成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)。


可用于:类型或数据的隐藏

 

 

const_cast

 

用法:const_cast<type_id> (expression)

 

说明:该运算符用来修改类型的constvolatile属性。除了const volatile修饰之外, type_idexpression的类型是一样的。



常量指针被转化成非常量指针,并且仍然指向原来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象;常量对象被转换成非常量对象。

 

指针的指向相同即指针相同


 [a1]下行不安全,但可以转换。

dynamic_cast下行直接报错,不允许转换。

static_cast,const_cast,dynamic_cast, reinterpret_cast四种类型转换区别

一 C风格显式转换和函数风格式转换     在C++中有些数据类型的转换是可以直接转换的,这种称为隐式转换。例如: double a = 12.0; int b = a;但有时编译器对于一些数据精度...
  • hhhhh2333
  • hhhhh2333
  • 2016-11-19 01:55:01
  • 469

xxx_cast类型转换static_cast/const_cast/reinterpret_cast/dynamic_cast

#include #include using namespace std; class Base { public: // void show() const virtual void s...
  • earbao
  • earbao
  • 2017-02-13 12:04:59
  • 314

C++中static_cast和dynamic_cast强制类型转换

前言 说起C++中的继承、多态、虚函数等概念,可能很多同学都有所了解,但是要说真正熟知的同学可能就不是很多了。最近在编程过程中了解到C++类型的层次转换(这就涉及到了多态和继承的相关概率),通常C语言...
  • qq_26849233
  • qq_26849233
  • 2017-03-15 11:45:10
  • 12015

C++类型转换----dynamic_cast(以及结合typeid的应用)

dynamic_cast用于具有继承体系的转换中,用于转换指针和引用,通常类必须要有一个虚函数,因为运行时类的运行信息存储在虚表中,如果没有虚表使用dynamic_cast将会导致编译错误。dynam...
  • u010154685
  • u010154685
  • 2016-07-02 15:19:30
  • 852

C++中的类型转换

  • 2015年07月23日 15:47
  • 44KB
  • 下载

C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast

类型转换是一种让程序员能够暂时或永久性改变编译器对对象的解释机制。可改变对象解释方式的运算符称为类型转换运算符。 为何需要进行类型转换 通常为了实现使用不同环境的个人和厂商编写的模块能够相互调用和协作...
  • LG1259156776
  • LG1259156776
  • 2015-07-22 15:55:45
  • 1154

static_cast、dynamic_cast、reinterpret_cast和const_cast

  • 2016年07月18日 12:47
  • 1007KB
  • 下载

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

以下文章转载自 :  http://www.cnblogs.com/chenyangchun/p/6795923.html如有侵权,请联系删除,谢谢1. c强制转换与c++强制转换 c语言强制类型转换...
  • dyingfair
  • dyingfair
  • 2018-02-26 23:26:28
  • 26

标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

  • 2011年02月18日 17:30
  • 176KB
  • 下载
收藏助手
不良信息举报
您举报文章:static_cast和dynamic_cast等类型转换
举报原因:
原因补充:

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