C++ 强制类型转换详解

类型转换只不过是让编译器以另外一种方式解释一块内存而已。C++兼容C语言的强制类型转换方式,同时也提供了新型的基于模板的类型转换方式,来提供更多的安全性。

一、C风格的强制类型转换

double k = (double)(5 / 3);

这种类型转换是不执行任何检查的,这意味着以下类型转换同样能够通过编译:

struct A
{
  	int a;
    double b;
};

int main(int argc, char *argv)
{
    const char *msg = "Hello";
    A *obj = (A *)msg; // 通过编译,但是不合法。
    return 0;
}

这样obj对象是不合法的。因此,C++代码最好不要采取这种做法。

二、C++类型转换:static_cast

static_cast转换主要用于以下情况:

  • 相关基本数据类型之间的类型转换
  • 子类转换为父类类型
  • void*指针转换为其它类型指针
  • 同数据类型的引用类型的类型转换
class Base {};
class Derive : public Base {};

int main(int argc, char *argv[])
{
    // 一:相关基本数据类型之间的类型转换
    int a = static_cast<int>(4.2);
    // 二:子类转换为父类类型
    Base base = static_cast<Base>(Derive());
    // 三:将void*转换为其它类型指针
    void *p = &a;
    int *pa = static_cast<int*>(p);
    // 四:同数据类型的引用类型的类型转换
    int &aref = static_cast<int&>(a);
    int &&arref = static_cast<int&&>(a);
    return 0;
}

三、C++类型转换:dynamic_cast

dynamic_cast用于将父类指针(或引用)向子类指针(或引用)的类型转换。

注意:为了使用dynamic_cast,类中必须包含虚函数。

class Base {};
class Derive : public Base {};

int main(int argc, char *argv[])
{
    Base *b = new Derive();
    Derive *d = dynamic_cast<Derive*>(b);
    return 0;
}

四、C++类型转换:const_cast

const_cast用于除去指针或者引用的const属性:

int main(int argc, char *argv[])
{
    const int a = 0;
    const int *const p = &a;
    int *pa = const_cast<int*>(p);
    *pa = 10; // a = 0, *pa = 10
    return 0;
}

由于const限定符,a的值不会被改变,详见:C++ const详解

五、C++类型转换:reinterpret_cast

reinterpret_cast处理无关数据类型之间的转换。

struct A 
{
  	int a;
    double b;
};

int main(int argc, char *argv)
{
    A a = {0, 0};
    A *pa = &a;
    char *c = reinterpret_cast<char*>(pa);
    return 0;
}
发布了7 篇原创文章 · 获赞 1 · 访问量 416

猜你喜欢

转载自blog.csdn.net/ZKY1998/article/details/104201248