设为首页 加入收藏

TOP

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用(一)
2016-04-26 09:43:22 】 浏览:713
Tags:static_cast/const_cast/dynamic_cast/reinterpret_cast 区别 使用

C风格的强制转换较简单,如将float a转换为int b,则可以这样:b = (int)a,或者b=int(a)。

C++类型转换分为隐式类型转换和显示类型转换。

隐式类型转换又称为标准转换,包括以下几种情况:

(1)、算术转换:在混合类型的算术表达式中,最宽的数据类型成为目标转换类型;

(2)、一种类型表达式赋值给另一种类型的对象:目标类型是被赋值对象的类型;

(3)、将一个表达式作为实参传递给函数调用,此时形参和实参类型不一致:目标转换类型为形参的类型;

(4)、从一个函数返回一个表达式,表达式类型与返回类型不一致:目标转换类型为函数的返回类型。

显示类型转换被称为强制类型转换(cast)。

C++提供了四种强制类型转换形式:static_cast、const_cast、dynamic_cast、reinterpret_cast.每一种适用于特定的场合。

static_cast语法:static_cast (expression)

static_cast:仅根据表达式中存在的类型,将expression转换为type-id类型。此运算符可用于将指向基类的指针转换为指向派生类的指针等操作。此类转换并非始终安全。

通常使用 static_cast 转换数值数据类型,例如将枚举型转换为整型或将整型转换为浮点型,而且你能确定参与转换的数据类型。 static_cast转换安全性不如dynamic_cast转换,因static_cast不执行运行时类型检查,而dynamic_cas执行该检查。对不明确的指针的 dynamic_cast将失败,而static_cast的返回结果看似没有问题,这是危险的。尽管 dynamic_cast转换更加安全,但是dynamic_cast只适用于指针或引用,而且运行时类型检查也是一项开销。dynamic_cast 和static_cast运算符可以在整个类层次结构中移动指针。然而,static_cast完全依赖于转换语句提供的信息,因此可能不安全。

static_cast可以反向执行隐式转换,可用于任何隐式允许的转换类型,而在这种情况下结果是不确定的。这需要程序员来验证static_cast转换的结果是否安全。

static_cast可用于将int转换为char。但是,得到的char可能没有足够的位来保存整个int值。同样,这需要程序员来验证static_cast转换的结果是否安全。

static_cast运算符还可用于执行任何隐式转换,包括标准转换和用户定义的转换。

static_cast 运算符可以将整数值显式转换为枚举类型。如果整型值不在枚举值的范围内,生成的枚举值是不确定的。

static_cast运算符将null指针值转换为目标类型的null指针值。

任何表达式都可以通过static_cast运算符显式转换为void类型。目标void类型可以选择性地包含const、volatile或__unaligned特性。

static_cast运算符无法转换掉const、volatile或 __unaligned特性。

只有在确信代码将正常运行的时候,在性能关键代码中使用 static_cast。如果必须在发布模式下使用static_cast,请在调试版本中用 safe_cast(C++ 组件扩展)替换它以确保成功。

const_cast语法:const_cast (expression)

const_cast:从类中移除const、volatile和__unaligned特性。

指向任何对象类型的指针或指向数据成员的指针可显式转换为完全相同的类型(const、volatile 和 __unaligned 限定符除外)。对于指针和引用,结果将引用原始对象。对于指向数据成员的指针,结果将引用与指向数据成员的原始(未强制转换)的指针相同的成员。根据引用对象的类型,通过生成的指针、引用或指向数据成员的指针的写入操作可能产生未定义的行为。

不能使用const_cast运算符直接重写常量变量的常量状态。

const_cast运算符将null指针值转换为目标类型的null指针值。

dynamic_cast语法:dynamic_cast (expression)

dynamic_cast:type-id必须是一个指针或引用到以前已定义的类类型的引用或“指向 void的指针”。如果type-id是指针,则expression的类型必须是指针,如果type-id是引用,则为左值。

在托管代码中的 dynamic_cast的行为中有两个重大更改:(1)、为指针的dynamic_cast对指向装箱的枚举的基础类型的指针将在运行时失败,则返回0而不是已转换的指针。(2)、dynamic_cast 将不再引发一个异常,当type-id是指向值类型的内部指针,则转换在运行时失败。该转换将返回0指示运行值而不是引发。

如果type-id是指向expression的明确的可访问的直接或间接基类的指针,则结果是指向type-id类型的唯一子对象的指针。

如果type-id为void*,则做运行时进行检查确定expression的实际类型。结果是指向byexpression的完整的对象的指针。

如果type-id不是 void*,则做运行时进行检查以确定是否由expression指向的对象可以转换为由type-id指向的类型。如果expression类型是type-id类型的基类,则做运行时检查来看是否expression确实指向type-id类型的完整对象。如果为true,则结果是指向type-id类型的完整对象的指针。

dynamic_cast运算符还可以使用执行“相互转换”。使用同一个类层次结构可能进行指针转换。

当使用dynamic_cast时,如果expression无法安全地转换成类型type-id,则运行时检查会引起变换失败。

指针类型的非限定转换的值是null指针。引用类型的非限定转换会引发bad_cast异常。

reinterpret_cast语法:reinterpret_cast (expression)

reinterpret_cast:允许将任何指针转换为任何其他指针类型。也允许将任何整数类型转换为任何指针类型以及反向转换。

滥用reinterpret_cast运算符可能很容易带来风险。除非所需转换本身是低级别的,否则应使用其他强制转换运算符之一。

reinterpret_cast运算符可用于char*到int*或One_class*到Unrelated_class*之类的转换,这本身并不安全。

reinterpret_cast的结果不能安全地用于除强制转换回其原始类型以外的任何用途。在最好的情况下,其他用途也是不可移植的。

reinterpret_cast运算符不能丢掉const、volatile或__unaligned特性。

reinterpret_cast运算符将null指针值转换为目标类型的null指针值。

reinterpret_cast的一个实际用途是在哈希函数中,即,通过让两个不同的值几乎不以相同的索引结尾的方式将值映射到索引。

static_cast is the first cast y

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【一天一道LeetCode】#26. Remove.. 下一篇笔试题37. LeetCode OJ (24)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目