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

C++ 类型转换

2016-05-03 11:36 411 查看
1.提到的类型转换只用来针对自定义class级别的,而针对基本数据类型,不做说明。

2.提到的类型转换操作符有reinterpret_cast, static_cast, const_cast, dynamic_cast,用法如下:

reinterpret_cast<new_type>(expression)

dynamic_cast<new_type>(expression)

static_cast<new_type>(expression)

const_cast<new_type>(expression)

3.以上转换操作都是指针复制,也就是说,转换后的指针指向的地址与被转换的指针指向的地址是同一个地址!

具体简单暴力的解释:

先给代码:

class Base {virtual void dummy(){};};

class CastA {};

class CastB {};

class CastC : public Base {

void dummy();

};

void CastC::dummy() {

}

int main(int argc, const char * argv[]) {

// insert code here...

std::cout << "Hello, World!\n";

CastA *castA = new CastA();

// CastB *reinterpertA = reinterpret_cast<CastA *>(castA); // 编译时就会报错:不能从一个CastA类型数据初始化一个CastB类型,错的很2
CastB *reinterpertBFromA = reinterpret_cast<CastB *>(castA); // OK. 什么都不管,就是转换。
// 可见,reinterpret_cast 操作符能够在非相关的类型之间转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换

// CastB *staticA = static_cast<CastB *>(castA);//编译直接报错:CastA与CastB没有继承相关的关系。

Base *base = new Base;

CastC *staticCFromBase = static_cast<CastC *>(base); // OK
// 可见,static_cast操作符 主要用来做子类类型的指针与父类类型的指针相互转换

const CastA *constCastA = new CastA();

// CastB *constB = const_cast<CastB *>(castA); //
编译报错

// const CastB *constB = const_cast<CastB *>(constCastA); //
编译直接报错
// 综合以上两条,得到:不允许做这样的转换,也就是不同类型之间的转换,const_cast做不到

CastA *variableCastA = const_cast<CastA *>(constCastA); // OK
// 可见,const_cast操作符操作传递过来的对象的const属性,或者是设置或者是移除,并不做不同类类型之间的转换操作

// CastB *dynamicB = dynamic_cast<CastB *>(castA); //编译报错:提示CastA类不具有多态性

CastC *dynamicCFromBase = dynamic_cast<CastC *>(base); // OK, 但是dynamicCFromBase 却是NULL,因为base是虚基类,在运行时,将虚基类转换成子类不可行。

CastC *castC = new CastC();

CastC *dynamicCFromC = dynamic_cast<CastC *>(castC); // OK
// 综上可见,dynamic_cast操作符操作的对象必须具有多态性的类型,且不关心类与类之间的关系,且转换是在运行时完成的,如果转换成功则返回指针的地址;如果转换不成功,则返回NULL,并不会crash

return 0;

}

总结:

·dynamic_cast 主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。它是唯一不能用旧风格语法执行的强制转型,也是唯一可能有重大运行时代价的强制转型。

·static_cast 可以被用于强制隐型转换(例如,non-const 对象转型为 const 对象,int 转型为 double,等等),它还可以用于很多这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于C-style的转换。

·const_cast 一般用于强制消除对象的常量性。它是唯一能做到这一点的 C++ 风格的强制转型。

·reinterpret_cast 是特意用于底层的强制转型,导致实现依赖(implementation-dependent)(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制转型在底层代码以外应该极为罕见。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: