- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
static_cast和 reinterpret_cast
reinterpret_cast 可以转换任意一个 32bit 整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力最为强大! 但不能将非 32bit 的实例转成指针。总之,只要是32bit 的东东,怎么转都行!
static_cast 和 dynamic_cast 可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast 只能提供编译时的类型安全,而 dynamic_cast 可以提供运行时类型安全。举个例子:
class a;class b:a;class c。
上面三个类a 是基类,b 继承 a,c 和 ab 没有关系。有一个函数 void function(aa);
现在有一个对象是b 的实例b,一个c 的实例c。
function(static_casta(b)可以通过而 function(statica(c))不能通过编译,因为在编译的时候编译器已经知道c 和 a 的类型不符,因此 static_cast 可以保证安全。
下面我们骗一下编译器,先把c 转成类型a bref_b = reinterpret_castbc;
然后 function(static_casta(ref_b))就通过了!因为从编译器的角度来看,在编译时并不能知道 ref_b 实际上是c!
而 function(dynamic_casta(ref_b))编译时也能过,但在运行时就失败了,因为 dynamic_cast
在运行时检查了 ref_b 的实际类型,这样怎么也骗不过去了。
在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类型,用 static_cast 就可以了。至于 reinterpret_cast,我很喜欢,很象 c 语言那样的暴力转换:)
dynamic_cast:动态类型转换static_cast:静态类型转换reinterpret_cast:重新解释类型转换const_cast:常量类型转换
专业的上面很多了,我说说我自己的理解吧:
synamic_cast 一般用在父类和子类指针或应用的互相转化; static_cast 一般是普通数据类型(如 int m=static_castint(3.14)); reinterpret_cast 很像c 的一般类型转换操作
const_cast 是把 cosnt 或 volatile 属性去掉
.
介绍
大多程序员在学 C++前都学过 C,并且习惯于 C 风格(类型)转换。当写 C++(程序)时, 有时候我们在使用 static_cast和 reinterpret_cast时可能会有点模糊。在本文中,我将说明 static_cast实际上做了什么,并且指出一些将会导致错误的情况。
泛型(Generic Types)
float f = 12.3; float* pf = f;
// static cast
// 成功编译, n = 12 int n = static_castint(f);
// 错误,指向的类型是无关的(译注:即指针变量 pf 是 float 类型,现在要被转换为 int 类型) //int* pn = static_castint*(pf);
//成功编译
void* pv = static_castvoid*(pf);
//成功编译, 但是 *pn2 是无意义的内存(rubbish) int* pn2 = static_castint*(pv);
// reinterpret_cast
//错误,编译器知道你应该调用 static_cast
//inti = reinterpret_castint(f);
//成功编译, 但是 *pn 实际上是无意义的内存,和 *pn2 一样
int* pi = reinterpret_castint*(pf);简而言之,static_cast将尝试转换,举例来说,如 float-
到-integer,而 reinterpret_cast简单改变编译器的意图重新考虑那个对象作为另一类型。指针类型(Pointer Types)
指针转换有点复杂,我们将在本文的剩余部分使用下面的类:
classCBaseX
{
public:
int x;
CBaseX() { x = 10; }
void foo() { printf(CBaseX::foo() x=%d/n, x); }
};
classCBaseY
{
public:
int y; int* py;
CBaseY() { y = 20; py = y
您可能关注的文档
最近下载
- 人教版三年级上册语文《期中》测试卷.doc VIP
- (高清版)DB32∕T 4644.3-2025 从业人员健康检查 第3部分:质量控制规范.docx VIP
- 人教版九年级世界历史上册综合测试题.pdf VIP
- 贵州企业招聘:2024贵州京瑞宾馆有限责任公司招聘出纳笔试备考题库及答案解析.docx VIP
- DB3211_T 1057-2023 大棚黄瓜无土栽培技术规程.pdf VIP
- 农业机械安全操作规程.ppt VIP
- 2020年湖北省武汉中考英语试卷.pdf VIP
- 农村房赠与协议(标准版).doc VIP
- 《电子商务法》知识考试题库150题(含答案).docx VIP
- 两次约会见真章范文.pdf VIP
原创力文档


文档评论(0)