C/C++教程

c++类型强制转换

本文主要是介绍c++类型强制转换,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.const_cast

特性:1)可以去除变量的const 或者 volatile属性

void Type_transform::ConstCast()
{
    const Test t;
    t.s = "1111111"; //const 无法直接赋值 编译报错

    Test &tt  = const_cast<Test&>(t);
    tt.s = "1111111111"; //使用const_cast转换后取出了const属性可以正常赋值

}

2.static_cast

静态类型转换,基础类型的转换,不支持完全没有关系的两个类之间进行转换。

特性:1)由子类转成父类没有问题,但由父类转成子类不安全
2)完全没有关系的两个类之间不可以进行转换。

void Type_transform::StaticCast()
{
    Children *c = new Children;
    qInfo() << "c" << c->getParent() << endl;

    Parent *p = static_cast<Children*>(c); //子类转父类没有问题
    qInfo() << "p" << p->getParent() << endl;

    Parent *pp = new Parent;
    Children *cc = static_cast<Children*>(pp);

    if(cc != nullptr){
        qInfo() << cc->getParent() << endl;
        qInfo() << cc->getChildren() << endl; //父类转子类,调用子类成员函数时会出现问题
        //(当然会有问题,父类根本没有子类的函数~~)
    }

//    Test *t = new Test;
//    pp = static_cast<Parent *>(t); //完全不相关的类型不可以转换
    delete  c;
    delete  pp;
}

3.dynamic_cast

动态类型转换

特性:1)与static_cast相比,添加了由父类转为子类的检测,如果父类转换为子类会出错,返回一个空指针。
2)如果由父类转换为子类,父类一定要有虚函数,目的时可以生成虚函数表,让编译器知道父子类的关系,要不编译器会报错

void Type_transform::DynamicCast()
{

    Children *c = new Children;
    qInfo() << "c" << c->getParent() << endl;

    Parent *p = dynamic_cast<Children*>(c); //子类转父类没有问题
    qInfo() << "p" << p->getParent() << endl;

    Parent *pp = new Parent;
    Children *cc = dynamic_cast<Children*>(pp); //必须要有虚函数生成虚函数表,不然编译器报错
    if(cc != nullptr){ //转换出错,返回nullptr
        cc->getChildren();
    }

    delete  c;
    delete pp;
}

4.reinterpret_cast

仅重新解释类型,不知道有什么用(

这篇关于c++类型强制转换的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!