关闭

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

标签: C++强制类型转换
275人阅读 评论(0) 收藏 举报
分类:

C++的四种强制类型转换,所以C++不是类型安全的。分别为:

dynamic_cast  最安全(上行转换安全,下行转换不太安全),运行时处理,开销大。

static_cast  较为安全,编译时处理,效率高。

const_cast  不安全,改变const,编译时处理,效率高。

reinterpret_cast  不安全,可以转换所有数据,和C一样,编译时处理,效率高。

为什么使用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;
}

转改自:http://m.jb51.net/article/36914.htm

0
0
查看评论

C++四种强制类型转换运算符

C++有四种强制类型转换符,分别是dynamic_cast,const_cast,static_cast,reinterpret_cast。 其中dynamic_cast与运行时类型转换密切相关,在这里我们先介绍dynamic_cast,其他三种在后面介绍。 1、dynamic_cast运...
  • jsc0218
  • jsc0218
  • 2014-03-20 00:19
  • 7674

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

c++ 强制类型转换
  • april2009128
  • april2009128
  • 2015-09-09 10:56
  • 323

C++四种强制类型转换详解

什么是类型转换?     类型转换的含义是通过改变一个变量的类型为别的类型从而改变该变量的表示方式。为了类型转换一个简单对象为另一个对象你会使用传统的类型转换操作符。 C与C++的类型转换 //C中: //复制代码 代码如下: (T)element 或者 T(element) //c++中: //...
  • chenyiming_1990
  • chenyiming_1990
  • 2013-08-23 01:15
  • 1754

c++中的四种类型转化详解

隐式转换(implicit conversion) short a=2000; int b; b=a; short是两字节,int是四字节,由short型转成int型是宽化转换(bit位数增多),编译器没有warning,如下图所示。宽化转换(如char到int,int到lo...
  • lvfengchang1220
  • lvfengchang1220
  • 2015-05-13 21:44
  • 638

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

使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。   1 static_cast 用法:static_cast ( expression )     该...
  • u012456549
  • u012456549
  • 2013-10-25 17:46
  • 211

C++中四种强制类型转换

将一种类型转换为另一种类型,转换后的变量,它的内部数据存储方式也随之发生改变,c++有四个显示的类型转换函数,reinterpret_cast,const_cast,static_cast,dynamic_cast.前面三个是在编译期间实现转换的,最后一个是在运行时实现转换,还可返回转换成功与否标志...
  • u010441346
  • u010441346
  • 2014-08-24 20:32
  • 539

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

使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 1、static_cast     用法:static_cast (expression)     该运算符把expr...
  • qq1041256623
  • qq1041256623
  • 2014-11-03 10:14
  • 267

C++ 中四种强制类型转换

C++ 同时提供了四种新的强制转型形式(通常称为新风格的或 C++ 风格的强制转型): const_cast(expression) 主要用于去除变量的const属性 dynamic_cast(expression) 这种强制类型转换的方式主要用于基本类型之间的...
  • xunmengpiaoyun
  • xunmengpiaoyun
  • 2013-12-20 17:21
  • 558

C++中的四种强制类型转换cast(显式转换)

一、何时需要强制类型转换 1. 例如:double dval; int ival; ival *= dval;计算机计算时会将ival从int型转换为double型,之后又转回int型,为了去掉“将ival从int型转换为double型”这个不必要的转换,可以使用强制类型转换: ival *= st...
  • Levy1021
  • Levy1021
  • 2015-04-27 08:19
  • 1537

C++四种强制类型转换及其区别

昨天参加爱立信笔试的时候遇到了这样一个问题,就是解释一下C++四种强制类型转换的方法以及其应用场合,之前有看过这个知识点,但是,考试的时候怎么想也就没有写的很全面,于是,这里整理一下: C++中的四种强制类型转换除了具有C语言强制类型转换的功能外,还可提供更好的控制强制转换的过程;能更清晰地表明程...
  • xue815020462
  • xue815020462
  • 2013-06-11 10:12
  • 1275
    个人资料
    • 访问:111521次
    • 积分:2338
    • 等级:
    • 排名:第18908名
    • 原创:109篇
    • 转载:136篇
    • 译文:0篇
    • 评论:3条
    文章分类
    最新评论