C/C++

C++类型转换

2019-01-30  本文已影响0人  cx7

四种转换的机制 :

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++之间传递

上一篇下一篇

猜你喜欢

热点阅读