您的位置:首页 > 编程语言 > C语言/C++

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

2016-01-14 17:56 477 查看
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);//程序报错
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: