美文网首页C/C++
C++类型转换

C++类型转换

作者: cx7 | 来源:发表于2019-01-30 20:33 被阅读0次

    四种转换的机制 :

    static_cast

    强制类型转换 所有编译器隐式执行的转换都可以由static_cast来转换

    int a = 5;
    float b = static_cast<float>(a);
    

    效果类似于C风格代码的强制类型转换

    int a = 5;
    float b = (float)a;
    

    要注意的是 static_cast不能进行指针类型的转换 除非是基类和派生类的转换

    const_cast

    去除变量的const属性 和C++11新增的mutable作用类似 都是为了突破const的限制

    int b = 10;
    const int* a = &b;
    int *p = const_cast<int *>(a);
    (*p)++;
    

    a被const修饰且const在*的左边 所以a指向的区域是不可变的
    经过const_cast转换后 p可以访问b 且可以修改b

    dynamic_cast

    基类指针转换到派生类指针 在runtime时发生的转换(其余都是编译时确定)

    #include<iostream>
    using namespace std;
    
    class a {
    public:
        virtual void call() {
            cout << "a cacll" << endl;
        }
    };
    
    class b : public a {
    public:
        virtual void call() {
            cout << "b call" << endl;
        }
    };
    
    int main(int argc, char **argv)
    {
        a *a1 = new a();
        a *a2 = new b();
    
        b *b1 = dynamic_cast<b*>(a1);
        b *b2 = dynamic_cast<b*>(a2);
        b *b3 = static_cast<b*>(a1);
        b *b4 = static_cast<b*>(a2);
    
        cout << "b1 " << b1 << endl;
        cout << "b2 " << b2 << endl;
        cout << "b3 " << b3 << endl;
        cout << "b4 " << b4 << endl;
    
        delete a1;
        delete a2;
        return 0;
    }
    

    输出的结果

    b1 0x0
    b2 0x7feae9402a80
    b3 0x7feae94006a0
    b4 0x7feae9402a80
    

    dynamic_cast是安全的转换 当转换失败时 返回空指针
    static_cast转换不安全 有风险

    reinterpret_cast

    不同类型的转换 常见的是在指针和整数间做转换

    int b = 10;
    int *a = &b;
    cout << "a " << a << endl;
    
    long addr = reinterpret_cast<long>(a);
    cout << "addr " << addr << endl;
    int *c = reinterpret_cast<int *>(addr);
    cout << "c " << c << endl;
    

    JNI编程里这种做法很常见 将指针转换为long整形数 在java和c++之间传递

    相关文章

      网友评论

        本文标题:C++类型转换

        本文链接:https://www.haomeiwen.com/subject/kfycsqtx.html