收藏 分享(赏)

static_cast、dynamic_cast、const_cast作用.doc

上传人:wspkg9802 文档编号:6614553 上传时间:2019-04-18 格式:DOC 页数:7 大小:20.30KB
下载 相关 举报
static_cast、dynamic_cast、const_cast作用.doc_第1页
第1页 / 共7页
static_cast、dynamic_cast、const_cast作用.doc_第2页
第2页 / 共7页
static_cast、dynamic_cast、const_cast作用.doc_第3页
第3页 / 共7页
static_cast、dynamic_cast、const_cast作用.doc_第4页
第4页 / 共7页
static_cast、dynamic_cast、const_cast作用.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

1、static_cast、dynamic_cast、const_cast 作用C-style cast 举例:int i;double d;i = (int) d;上面的代码就是本来为 double 类型的 d,通过(int)d 将其转换成整形值,并将该值赋给整形变量 i (注意 d 本身的值并没有发生改变)。这就是典型的 c-style 类型转换。下面是一个简单的程序:#include using namespace std;int main(void)int i;double d = 11.29;i = (int)d;cout (expression)说明:该运算符把 expression

2、转换为 typeid 类型,但没有运行时类型检查来确保转换的安全性。用途:a)用于类层次结构中基类和派生类之间指针或者引用的转换。up-casting (把派生类的指针或引用转换成基类的指针或者引用表示)是安全的;down-casting(把基类指针或引用转换成子类的指针或者引用)是不安全的。b)用于基本数据类型之间的转换,如把 int 转换成 char,这种转换的安全性也要由开发人员来保证。c)可以把空指针转换成目标类型的空指针(null pointer)。d)把任何类型的表达式转换成 void 类型。注意:static_cast 不能转换掉 expression 的 const、volit

3、ale 或者_unaligned 属性。2) dynamic_cast用法:dynamic_cast (expression)说明:该运算符把 expression 转换成 typeid 类型的对象。typeid 必须是类的指针、类的引用或者 void*。如果 typeid 是类的指针类型,那么 expression 也必须是指针,如果 typeid 是一个引用,那么expression 也必须是一个引用。一般情况下,dynamic_cast 用于具有多态性的类(即有虚函数的类)的类型转换。dynamic_cast 依赖于 RTTI 信息,其次,在转换时,dynamic_cast 会检查转换的

4、 source 对象是否真的可以转换成 target 类型,这种检查不是语法上的,而是真实情况的检查。先看 RTTI 相关部分,通常,许多编译器都是通过 vtable 找到对象的 RTTI 信息的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型,这时候,dynamic_cast 只能用来做安全的转换,例如从派生类指针转换成基类指针。而这种转换其实并不需要 dynamic_cast 参与。也就是说,dynamic_cast是根据 RTTI 记载的信息来判断类型转换是否合法的。用途:主要用于类层次之间的 up-casting 和 down-casting,还可以用

5、于类之间的交叉转换。在进行 down-casting 时,dynamic_cast具有类型检查的功能,比 static_cast 更安全。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为 NULL。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与 static_cast 不同,在后一种情况里(注:即隐式转换的相反过程),dynamic_cast 会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。注意:dynamic_cast 不能转换掉 expression 的 const、volitale 或者_unaligned

6、属性。3) reinterpret_cast用法:reinterpret_cast (expression)说明:转换一个指针为其他类型的指针,也允许将一个指针转换为整数类型,反之亦然。这个操作符能够在非相关的类型之间进行转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。这是一个强制转换。使用时有很大的风险,慎用之。注意:reinterpret _cast 不能转换掉 expression 的 const、volitale 或者_unaligned 属性。4) const_cast用法:const_cast(expression)说明:

7、这个类型操纵传递对象的 const 属性,或者是设置或者是移除。如:Class Cconst C* a = new C;C* b = const_cast(a);如果将上面的 const_cast 转换成其他任何其他的转换,编译都不能通过,出错的信心大致如下:“cannot convert from const class C * to class C *”。下面的代码是 4 中 casting 方法的典型用法示例:#includeusingnamespace std;class Basepublic:int _base;virtualvoid printinfo()cout ( / down

8、-casting 不安全Base* pb = static_cast( / up-casting 安全Derived / down-casting 不安全Base / up-casting 安全aInt = static_cast(aFloat); /基本数据类型转换void* sth = static_cast( /将 double指针类型转换成 void 指针类型double* bDouble = static_cast(sth); /将 void 指针类型转换成double 指针类型cout (/Derived* pd1 = dynamic_cast( /编译时有 warning,运行时

9、出错int bInt = reinterpret_cast(pb1); /将地址或指针转换成整数cout (bInt); /将整数转换成地址或指针int* cInt = reinterpret_cast( /这个转换的结果会出乎意料cout (bBase);/Base* dBase = dynamic_cast(bBase); /不能通过编译/Base* eBase = static_cast(bBase); /不能通过编译/Base* fBase = reinterpret_cast(bBase); /不能通过编译return 0;补充:dynamic_cast 的注意事项:dynamic_

10、cast 转换符只能用于指针或者引用。dynamic_cast 转换符只能用于含有虚函数的类。dynamic_cast 转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,如果转换失败,如果是指针则反回一个 0 值,如果是转换的是引用,则抛出一个bad_cast 异常,所以在使用 dynamic_cast 转换之间应使用 if 语句对其转换成功与否进行测试,比如 pd=dynamic_cast(pb); if(pd)else,或者这样测试 if(dynamic_cast(pb)else。const_cast 操作符:其表达式为 const_cast(表达式),其中类型指要

11、把表达式转换为的目标类型。该操作符用于改变 const 和 volatile,const_cast最常用的用途就是删除 const 属性,如果某个变量在大多数时候是常量,而在某个时候又是需要修改的,这时就可以使用 const_cast 操作符了。const_cast操作符不能改变类型的其他方面,他只能改变 const 或 volatile,即const_cast 不能把 int 改变为 double,但可以把 const int 改变为int。const_cast 只能用于指针或引用。const_cast 的用法举例比如:int a=3; const int *b= int* c; c=con

12、st_cast(b); *c=4; couta*c;这时输出两个 4,如果不使用 const_cast 转换符则常量指针*c 的值是不能改变的,在这里使用 const_cast 操作符,通过指针 b 就能改变常量指针和变量 a 的值。static_cast 操作符:该操作符用于非多态类型的转换,任何标准转换都可以使用他,即 static_cast 可以把 int 转换为 double,但不能把两个不相关的类对象进行转换,比如类 A 不能转换为一个不相关的类 B 类型。static_cast 本质上是传统 c 语言强制转换的替代品。reinterpret_cast 操作符:该操作符用于将一种类型转换为另一种不同的类型,比如可以把一个整型转换为一个指针,或把一个指针转换为一个整型,因此使用该操作符的危险性较高,一般不应使用该操作符。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报