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

来源:互联网 发布:3d定制女仆mac 编辑:程序博客网 时间:2024/05/19 12:41

1、static_cast
    用法:static_cast<type_id> (expression)
    该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:
    (1)用于类层次结构中基类和派生类之间指针或引用的转换
    进行上行转换(把派生类的指针或引用转换成基类表示)是安全的
    进行下行转换(把基类的指针或引用转换为派生类表示),由于没有动态类型检查,所以是不安全的
    (2)用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证
    (3)把空指针转换成目标类型的空指针
    (4)把任何类型的表达式转换为void类型

使用:

 

class CBase { 

 

         virtualvoid foo(){};

};

 

class CDerived : public CBase

{

public:

         char*m_szName[100];

};

 

class CFerived : public CBase

{

 

};

 

         //static_cast转换

         CBase*pB = NULL;

         CDerived*pD = NULL;

         pB= static_cast<CBase *>(pD);//向上转换 安全

         pD= static_cast<CDerived *>(pB);//向下转换 不安全

 

         CBaseB;

         CDerivedD;

         B= static_cast<CBase>(D);//派生类对象转换成基类对象

         //D= static_cast<CDerived>(B);//基类对象不能转换成派生类对象

 

         inttsdfe = 1;

         //chars = "de";

         //s= static_cast<char>(tsdfe);//用于基本数据类型之间的转换,如把int转换成char。这种转换的安全也要开发人员来保证

 

         void*pTemp = NULL;

         CDerived* pTag = NULL;

         pTag= static_cast<CDerived *>(pTemp);//把空指针转换成目标类型的空指针

 

 

2、dynamic_cast

    用法:dynamic_cast<type_id>(expression)

    该运算符把expression转换成type_id类型的对象。type_id必须是类的指针、引用或者void*;

    如果type_id是类指针类型,那么expression也必须是一个指针,如果type_id是一个引用,那么expression也必须是一个引用。

   dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。

    在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;

 

         //dynamic_cast动态转换

 

         //这是由于运行时类型检查需要运行时类型信息,而这个信息存储在类的虚函数表(

         //      关于虚函数表的概念,详细可见<Insidec++ object model>)中,只有定义了虚函数的类才有虚函数表,

         //      没有定义虚函数的类是没有虚函数表的。

 

         CBase*PB1 = new CBase();//指向CBase对象的CBase指针,

         CBase*PB2 = new CDerived();//指向CDerived对象的CBase指针,

 

         //CDerived*pd1 = static_cast<CDerived *>(PB1);

 

         CDerived*pd1 = dynamic_cast<CDerived *>(PB2);//安全

         CDerived*pd12 = static_cast<CDerived *>(PB2);//安全

 

         CDerived*p1d1 = dynamic_cast<CDerived *>(PB1);//一个空指针

         CDerived*p1d2 = static_cast<CDerived *>(PB1);//一个指向该对象的指针,对它进行CDerived中有的CBase中没有类型的操作将是不安全的

        

         //dynamic_cast还支持交叉转换结果是空指针。

         //例如:

 

         //CBase*B1 = new CBase();

         CDerived*D1 = new CDerived();

         CFerived*F1 = NULL; //= new CFerived();

         F1= dynamic_cast<CFerived *>(D1);//F1是空指针

         //F1= static_cast<CFerived *>(D1);//程序报错

0 0
原创粉丝点击