解析C++中四种强制类型转换的区别详解

 更新时间:2013年05月16日 11:16:12   作者:  
本篇文章是对C++中四种强制类型转换的区别进行了详细的分析介绍,需要的朋友参考下
C++的四种强制类型转换,所以C++不是类型安全的。分别为:static_cast , dynamic_cast , const_cast , reinterpret_cast
为什么使用C风格的强制转换可以把想要的任何东西转换成合乎心意的类型。那为什么还需要一个新的C++类型的强制转换呢?
新类型的强制转换可以提供更好的控制强制转换过程,允许控制各种不同种类的强制转换。C++中风格是static_cast<type>(content)。C++风格的强制转换其他的好处是,它们能更清晰的表明它们要干什么。程序员只要扫一眼这样的代码,就能立即知道一个强制转换的目的。
四种转换的区别:
static_cast:可以实现C++中内置基本数据类型之间的相互转换。
复制代码 代码如下:

int c=static_cast<int>(7.987);

如果涉及到类的话,static_cast只能在有相互联系的类型中进行相互转换,不一定包含虚函数
复制代码 代码如下:

class A
{};
class B:public A
{};
class C
{};

int main()
{
    A* a=new A;
    B* b;
    C* c;
    b=static_cast<B>(a);  // 编译不会报错, B类继承A类
    c=static_cast<B>(a);  // 编译报错, C类与A类没有任何关系
    return 1;
}

const_cast: const_cast操作不能在不同的种类间转换。相反,它仅仅把一个它作用的表达式转换成常量。它可以使一个本来不是const类型的数据转换成const类型的,或者把const属性去掉。
reinterpret_cast: 有着和C风格的强制转换同样的能力。它可以转化任何内置的数据类型为其他任何的数据类型,也可以转化任何指针类型为其他的类型。它甚至可以转化内置的数据类型为指针,无须考虑类型安全或者常量的情形。不到万不得已绝对不用。
dynamic_cast:
(1)其他三种都是编译时完成的,dynamic_cast是运行时处理的,运行时要进行类型检查。
(2)不能用于内置的基本数据类型的强制转换。
(3)dynamic_cast转换如果成功的话返回的是指向类的指针或引用,转换失败的话则会返回NULL。
(4)使用dynamic_cast进行转换的,基类中一定要有虚函数,否则编译不通过。
        B中需要检测有虚函数的原因:类中存在虚函数,就说明它有想要让基类指针或引用指向派生类对象的情况,此时转换才有意义。
        这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(关于虚函数表的概念,详细可见<Inside c++ object model>)中,
        只有定义了虚函数的类才有虚函数表。
 (5)在类的转换时,在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。在进行下行转换时,dynamic_cast具有类型检查的功能,比               static_cast更安全。向上转换即为指向子类对象的向下转换,即将父类指针转化子类指针。向下转换的成功与否还与将要转换的类型有关,即要转换的指针指向的对象的实际类型与转换以后的对象类型一定要相同,否则转换失败。
参考例子:
复制代码 代码如下:

#include<iostream>
#include<cstring>
using namespace std;
class A
{
   public:
   virtual void f()
   {
       cout<<"hello"<<endl;
       };
};

class B:public A
{
    public:
    void f()
    {
        cout<<"hello2"<<endl;
        };

};

class C
{
  void pp()
  {
      return;
  }
};

int fun()
{
    return 1;
}
int main()
{
    A* a1=new B;//a1是A类型的指针指向一个B类型的对象
    A* a2=new A;//a2是A类型的指针指向一个A类型的对象
    B* b;
    C* c;
    b=dynamic_cast<B*>(a1);//结果为not null,向下转换成功,a1之前指向的就是B类型的对象,所以可以转换成B类型的指针。
    if(b==NULL)
    {
        cout<<"null"<<endl;
    }
    else
    {
        cout<<"not null"<<endl;
    }
    b=dynamic_cast<B*>(a2);//结果为null,向下转换失败
    if(b==NULL)
    {
        cout<<"null"<<endl;
    }
    else
    {
        cout<<"not null"<<endl;
    }
    c=dynamic_cast<C*>(a);//结果为null,向下转换失败
    if(c==NULL)
    {
        cout<<"null"<<endl;
    }
    else
    {
        cout<<"not null"<<endl;
    }
    delete(a);
    return 0;
}

相关文章

  • C++获取当前系统时间的方法总结

    C++获取当前系统时间的方法总结

    这篇文章主要介绍了C++获取当前系统时间的方法,实例总结了四个获取系统时间的方法,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • c++ 中__declspec 的用法详解

    c++ 中__declspec 的用法详解

    这篇文章主要介绍了c++ 中__declspec 的用法详解,对初学者有一定的帮助,有需要的可以了解一下。
    2016-11-11
  • C语言中进程信号集的相关操作函数详解

    C语言中进程信号集的相关操作函数详解

    这篇文章主要介绍了C语言中进程信号集的相关操作函数详解,包括sigismember函数和sigfillset函数以及sigemptyset函数的用法,需要的朋友可以参考下
    2015-09-09
  • 深入讲解C++中的构造函数

    深入讲解C++中的构造函数

    这篇文章主要介绍了C++中的构造函数,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C语言实现电话簿管理系统

    C语言实现电话簿管理系统

    这篇文章主要为大家详细介绍了C语言实现电话簿管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • C语言计算日期差的方法示例

    C语言计算日期差的方法示例

    这篇文章主要介绍了C语言计算日期差的方法,结合具体实例形式分析了C语言针对日期转换、运算等相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • 常用的C语言编程工具汇总

    常用的C语言编程工具汇总

    c语言编程软件适于编写系统软件,是学习编程的同学们的必备软件。c语言一种非常强大的计算机语言,应用非常广泛,不仅仅是在软件开发上,而且各类科研都会用到c语言。今天小编给大家汇总下C语言的编程工具
    2018-01-01
  • C++11 模板参数的“右值引用”是转发引用吗

    C++11 模板参数的“右值引用”是转发引用吗

    这篇文章主要介绍了C++11 模板参数的“右值引用”是转发引用吗,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • C++学校运动会管理系统的实现

    C++学校运动会管理系统的实现

    这篇文章主要为大家详细介绍了C++如何实现学校运动会管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • 总结C/C++面试中可能会碰到的字符串指针题

    总结C/C++面试中可能会碰到的字符串指针题

    C/C++是最能体现程序员能力的语言之一,其功能强大,在IT行业的各个方面都有大量的应用。下面这篇文章主要介绍了总结了在C/C++面试中可能会碰到的字符串指针题,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-01-01

最新评论