在使用这一段时间中,数据类型太多了,很多都需要转换。本章为总结。

C++强制转换有四种

1
2
3
4
static_cast<>()
dynamic_cast<>()
const_cast<>()
reinterpret_cast<>()
  • static_cast 基本数据的转换、空指针与指针之间的转换

    目前使用于信号槽函数强制转换,基于QT5的新特性,在使用connect时,第二第四个参数产生的为&className::functionName,如果函数被重载了,QT无法判断需要使用哪个信号,即使你的槽函数设置对应的参数,这里需要对第二个参数进行强制转换,如下。

    static_cast<void (className::*)(parameter)>(&className::functionName)这样可以将函数进行强制转换,解决信号定位的问题。

  • dynamic_cast<>() 类的下行转换,由基数向派生类转换

    目前没有使用过

  • const_cast<>() 去掉const或者volatile属性

    1
    2
    const char *cstr="rts";
    char *str=const_cast<char *>(cstr);
  • reinterpret_cast<>() 主要将数据从一种类型转换为另一种类型,二进制的形式重新解释

    在使用windows api的时候,需要使用宽字符wcahr_t,而qt里面没有原这样的类型,但是qstring有转换成宽字符的函数,操作如下

    1
    2
    QString str;
    reinterpret_cast<const wchar_t *>(str.utf16());
百度百科介绍,static_cast进行类的转换,会进行实际的偏移,而reinterpret_cast不会
  • qobject_cast(QObject *object)

    该转换只适用于继承自object的派生类,且类中带有Q_OBJECT宏声明。

    用于将一个QObject对象转换为对应的派生类,如果类型不符合,则转换为0;

    sender为槽对象,默认是QObject类型 在这里,如果有多个不同的信号对应同一个槽,可以根据该转换来判断传递对象的类型,像这里,如果sender是QLabel则会转换成功,否则为空

    1
    qobject_cast<QLabel *>(sender());
  • qgraphicsitem_cast

  • qvariant_cast