Henkk

导航

C++ 及QT 强制类型转化

C++: dynamic_cast、const_cast 、static_cast、reinterpret_cast

dynamic_cast:

  支持RTTI  主要用于向下转化 下行安全

const_cast :

  将const转变为非const

  变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。

  用法:const_cast<type>(expression) 通过const_cast运算符,也只能将const type*转换为type*,将const type&转换为type&。

   const 的机制,就是在编译期间,用一个常量代替了 data。这种方式叫做常量折叠

static_cast:

  1. 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
  2. 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。因为可能派生类定义了 基类中 没有的成员变量。

  ------static_cast常用来进行基本类型直接的转换,如char与int、int与float、enum与int之间;

  -------static_cast也可以转换用户自定义类型,但目标类型必须含有相应的构造函数;

  ------static_cast还可以转换对象的指针类型,但它不进行运行时类型检查,所以是不安全的;

  ------static_cast甚至可以把任何表达式都转换成void类型;

  ------satic_cast不能移除变量的const属性,请参考const_cast操作符;

  ------static_cast进行的是简单粗暴的转换,所以其正确性完全由程序员自己保证。

  static_cast 会做 编译时的类型检查,而 强制转换不会。

reinterpret_cast:

  不安全

  只有将转换后的类型值转换回到其原始类型,这样才是正确使用reinterpret_cast方式。

QT :qobject_cast  qgraphicsitem_cast  qvariant_cast  

qobject_cast

   该函数类似于 C++中的dynamic_cast,但执行速度比dynamic_cast 更快,且不需要
  C++的RTTI 的支持,但qobject_cast 仅适用于QObject 及其派生类

qgraphicsitem_cast 

  只适用于QGraphicsItem 的子类

  它的优势在于,它并不使用 RTTI,而且转换失败的话会返回 nullptr 

qvariant_cast 

  QVariant类型转换为实际的类型

 

posted on 2023-06-16 15:10  Henkk  阅读(149)  评论(0编辑  收藏  举报